在该类中创建类数组

Create array of class in that class

本文关键字:数组 创建      更新时间:2023-10-16

我试图在c++中添加一个四叉树。到目前为止,我有以下代码:

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

但是我得到一个错误"错误:不允许不完整的类型"。我做错了什么?

首先,你不能声明没有大小的数组。你的错误恰恰是告诉它;)

其次,不允许在object的类中创建同一个类的对象。

你唯一能做的就是在这个类中引用或指针指向同一个类的对象。

所以改成

QuadTree children[]; // this line

:

QuadTree **children; // this line

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;
    //...
};

正如其他答案所说,您不能在自身内部创建同一个类的非静态实例。然而,没有答案说明为什么这是正确的。以以下代码为例:

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