在该类中创建类的数组

时间:2014-03-20 20:23:06

标签: c++ class incomplete-type

我试图在c ++中添加QuadTree。到目前为止我有这个代码:

class QuadTree {
private:
    AABB bounds;

    QuadTree children[]; // this line
public:
    QuadTree(AABB bounds) : bounds(bounds) {

    }
};

但我收到错误"错误:不允许不完整类型"。我做错了什么?

3 个答案:

答案 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(); }
}