C++ 对象的前向声明

标签 c++ forward-declaration

我正在尝试弄清楚如何在新对象存储其他新对象的地方转发声明对象,例如:

一个队列,包含节点,这些节点包含包含 2 个列表或最好是 2 个队列的数据项。

这是我的数据.h

#ifndef DATA_H_
#define DATA_H_

class List;
class Data {
public:
    Data();
    Data(int aID);
    virtual ~Data();
    virtual int getID();
    virtual void setID(int aID);
private:
    int ID;
    List *listOne;
    List *listTwo;
};

#endif /* DATA_H_ */

还有我的Data.c

#include "Data.h"
#include "List.h"

Data::Data() {
    listOne = new List();
    listTwo = new List();
    Data::ID = 0;
}

Data::Data(int aID) {
    Data::listOne = new List();
    Data::listTwo = new List();
    Data::ID = aID;
}

Data::~Data() {
    delete(listOne);
    delete(listTwo);
}

int Data::getID() {
    return Data::ID;
}

void Data::setID(int aID) {
    Data::ID = ID;
}

错误信息:

..\Data.cpp: In constructor 'Data::Data()':
..\Data.cpp:12:23: error: invalid use of incomplete type 'class List'
  listOne = new List();
                       ^
In file included from ..\Data.cpp:8:0:
..\Data.h:11:7: note: forward declaration of 'class List'
 class List;
       ^
..\Data.cpp:13:22: error: invalid use of incomplete type 'class List'
  listTwo = new List();
                      ^
In file included from ..\Data.cpp:8:0:
..\Data.h:11:7: note: forward declaration of 'class List'
 class List;
       ^
..\Data.cpp: In constructor 'Data::Data(int)':
..\Data.cpp:18:29: error: invalid use of incomplete type 'class List'
  Data::listOne = new List();
                             ^
In file included from ..\Data.cpp:8:0:
..\Data.h:11:7: note: forward declaration of 'class List'
 class List;
       ^
..\Data.cpp:19:28: error: invalid use of incomplete type 'class List'
  Data::listTwo = new List();
                            ^
In file included from ..\Data.cpp:8:0:
..\Data.h:11:7: note: forward declaration of 'class List'
 class List;
       ^
..\Data.cpp: In destructor 'virtual Data::~Data()':
..\Data.cpp:24:18: warning: possible problem detected in invocation of delete operator: [-Wdelete-incomplete]
  delete(listOne);
                  ^
..\Data.cpp:24:18: warning: invalid use of incomplete type 'class List'
In file included from ..\Data.cpp:8:0:
..\Data.h:11:7: note: forward declaration of 'class List'
 class List;
       ^
..\Data.cpp:24:18: note: neither the destructor nor the class-specific operator delete will be called, even if they are declared when the class is defined
  delete(listOne);
                  ^
..\Data.cpp:25:17: warning: possible problem detected in invocation of delete operator: [-Wdelete-incomplete]
  delete(listTwo);
                 ^
..\Data.cpp:25:17: warning: invalid use of incomplete type 'class List'
In file included from ..\Data.cpp:8:0:
..\Data.h:11:7: note: forward declaration of 'class List'
 class List;
       ^
..\Data.cpp:25:17: note: neither the destructor nor the class-specific operator delete will be called, even if they are declared when the class is defined
  delete(listTwo);

现在,如果我删除 Data.h 中的前向声明并让 Data.h 包含 List.h,我将得到:并导致循环继承周期

..\Data.h:25:2: error: 'List' does not name a type
  List *cpubursts;
  ^
..\Data.h:26:2: error: 'List' does not name a type
  List *iobursts;

我将如何修复这种设置?

编辑:List.h

#ifndef LIST_H_
#define LIST_H_

#include "Node.h"

namespace std {

class List {
private:
    Node *top;
public:
    List();
    virtual ~List();
    virtual Node* getTop();
    virtual void add(Node * linkedNode);
    virtual void remove(Node * linkedNode);
};

} /* namespace std */

#endif /* LIST_H_ */

节点.h

#ifndef NODE_H_
#define NODE_H_

#include "Data.h"

namespace std {

class Node {
public:
    Node();
    Node(Data * aItem);
    virtual ~Node();
    virtual Node* getNext();
    virtual void setNext(Node * linkedNode);
    virtual Data* getData();
    virtual void setData(Data* item);
private:
    Node *next;
    Data *item;
};

} /* namespace std */

#endif /* NODE_H_ */

最佳答案

您在 std 命名空间内定义 List,并在其外部转发声明。当您这样做时,您是在说“在全局命名空间中有一个名为 List 的类”,当然没有。

你需要表达的是“在std命名空间中有一个名为List的类”,可以这样表达:

namespace std {
    class List;
}

class Data {
    /* your class */
};

我会质疑您为什么要在命名空间 std 中定义自己的类,但这不是重点。

关于C++ 对象的前向声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43021150/

相关文章:

c++ - 使用extern时C++中的重新声明错误

c++ - 将 typedef 转发声明到原始类型

c++ - 让细节命名空间代码看不见 - 优雅

c++ - 仅在库 cpp 中具有定义的前向声明结构

c++ - 将使用 typedef 创建成员

c++ - 如何使用 initializer_list

c++ - 澄清智能指针的 operator* 和 operator-> 重载

c++ - 指向数组的指针和错误 C2057、C2540

c - 未初始化的 C 字符串没有警告

c++ - Gtkmm 程序编译正常但崩溃 - Windows XP