1

ファイルでmy を定義structしましたが、.hファイルからアクセスしようとしてい.ccます。ただし、コンパイル時にエラーが発生し続けます。

これは私の中にあります.h

class List
{ 
 public:
   struct ListNode 
   {
     string data;
     ListNode* next;
   };
}

そして、これは私の.ccファイルにあります:(.hファイル含まれています)

struct ListNode* startPtr;

List::List(void)
{
  startPtr = new ListNode;
  startPtr = nullptr;
}

このように使おうとすると、

void Print()
 { 
 while (startPtr) 
  { 
    cout << startPtr->data << endl;
    startPtr = startPtr->next; 
  }
 }

次のようなエラーが表示されます

Forward declaration and unauthorized usage of undefined type. 
4

5 に答える 5

3

ファイル内includeのファイルが必要であり、内部で定義されているように、クラスの外部 (定義とメソッドの外部) からアクセスする場合は、このようにスコープを指定する必要があります。.h.ccListNodeclass ListList::ListNode

class Listが特定の名前空間内で定義されている場合、たとえば、グローバル名前空間からmy_namespaceアクセスする場合は、これも指定する必要があることに注意してください。のように: 。ListNodemy_namespace::List::ListNode

于 2013-09-19T10:24:00.383 に答える
0

キリル・キーロフの答えを言い換えましょう。プログラムには 2 つのタイプがあります: - クラス List のスコープで定義された ListNode - グローバル スコープで定義された ListNode それはあなたのコンパイラがあなたに言おうとしていることです。エラーを修正するには、startPtr を定義するときに正しい ListNode タイプを参照する必要があります。たとえば、次のように記述します。

List::ListNode* startPtr;

それ以外の

struct ListNode* startPtr;
于 2013-09-19T11:41:57.670 に答える
0

あなたのリストノードクラスはインナークラスです。そのタイプは次のとおりです。使用するList::ListNodeだけではありませんListNode

また、前方宣言について言及しているように(このコードには何も表示されませんが)、内部クラスを前方宣言することはできません。

于 2013-09-19T10:25:27.667 に答える
0

ListNodeのネストされた型を作成したListため、 として参照する必要がありますList::ListNode。ただし、structwhen を宣言しなくてもかまいませstartPtrん。

もちろん、List::ListNodeは冗長なので、単にNode.

于 2013-09-19T10:25:37.920 に答える
0
  • .cc ファイルに .h ファイルを含めます
  • List::ListNodeネストされた型であるため、構造体を参照してください
  • struct ListNode* startPtr;ただ書く必要はありませんList::ListNode* startPtr;
  • .h ファイルのクラスList定義の後にセミコロンを挿入する
于 2013-09-19T10:36:50.713 に答える