1

我已经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文件中的.cc文件和ListNode里面定义的那样class List,如果你想从类外部(在它的定义和它的方法之外)访问它,你需要像这样指定范围List::ListNode

注意,如果class List定义在特定的命名空间内,例如my_namespace,如果你想ListNode从全局命名空间访问,你也需要指定这个。喜欢:my_namespace::List::ListNode

于 2013-09-19T10:24:00.383 回答
0

让我改写基里尔·基洛夫的回答。您的程序中有 2 种类型: - ListNode 在类 List 的范围内定义 - ListNode 在全局范围内定义 第二个是使用前向声明定义的,没有对其内容的实际描述。那是你的编译器试图对你说。要修复错误,您需要在定义 startPtr 时引用正确的 ListNode 类型,例如,您应该编写:

List::ListNode* startPtr;

代替

struct ListNode* startPtr;
于 2013-09-19T11:41:57.670 回答
0
  • 在 .cc 文件中包含 .h 文件
  • 将结构称为List::ListNode嵌套类型
  • 不必struct ListNode* startPtr;只写List::ListNode* startPtr;
  • List在 .h 文件中的类定义后插入分号
于 2013-09-19T10:36:50.713 回答
0

您的列表节点类是内部类。它的类型是:List::ListNode不只是ListNode像你一样使用它。

另外,正如您提到的前向声明(尽管我在此代码中没有看到任何声明):您将无法前向声明内部类。

于 2013-09-19T10:25:27.667 回答
0

您创建了ListNode一个嵌套类型List,因此您必须将其称为List::ListNode. 不过,您可以struct在声明时startPtr省略。

当然,由于List::ListNode是多余的,您可能希望将其重命名为Node.

于 2013-09-19T10:25:37.920 回答