我正在尝试弄清楚如何在新对象存储其他新对象的地方转发声明对象,例如:
一个队列,包含节点,这些节点包含包含 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/