我试图在c ++中添加QuadTree。到目前为止我有这个代码:
class QuadTree {
private:
AABB bounds;
QuadTree children[]; // this line
public:
QuadTree(AABB bounds) : bounds(bounds) {
}
};
但我收到错误"错误:不允许不完整类型"。我做错了什么?
答案 0 :(得分:0)
C ++标准9.2.4说:
非静态(9.4)数据成员不得有不完整的类型。在 特别是,C类不应包含类的非静态成员 C,但它可以包含指向C类对象的指针或引用。
这意味着您无法声明
class A {
public:
A a; // error: field ‘a’ has incomplete type
};
但你可以:
class A {
public:
A* a;
};
解决方案:
class QuadTree {
private:
AABB bounds;
QuadTree* children;
//...
};
答案 1 :(得分:0)
首先,您无法声明没有大小的数组。你的错误正好告诉它;)
其次,你不允许在对象类中创建同一个类的对象。
只有你能做的是在这个类中将引用或指针作为同一个类的对象。
所以改变这个:
QuadTree children[]; // this line
到此:
QuadTree **children; // this line
答案 2 :(得分:0)
正如其他答案所说,你不能在自己内部创建同一个类的非静态实例。然而,没有答案为什么这是真的。以此代码为例:
class MyClass
{
private: std::string s;
}
int main()
{
MyClass c;
}
当我们声明MyClass c
时,我们也通过调用默认构造函数来初始化它。当我们这样做时,它必须为MyClass
的每个成员分配(并初始化)内存,因此它也调用std::string
构造函数。现在,如果不是这样,MyClass
定义如下:
class MyClass
{
// note: not legal.
private: MyClass c;
}
然后MyClass
构造函数会调用MyClass
构造函数来调用MyClass
构造函数...
我们会有无限的递归和内存不足。现在,当我们定义MyClass
时:
class MyClass
{
private: MyClass* c;
}
当我们创建MyClass
时,我们只需要为指针分配内存,一切都会好的。但是,这段代码会在运行时导致同样的问题,但它将是完全合法的代码。
class MyClass
{
private: MyClass* c;
public: MyClass(){ c = new MyClass(); }
}