在该类中创建类数组
Create array of class in that class
我试图在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(); }
}
相关文章:
- 在c++中为double类型的数组创建一个unique_ptr
- 如何从预定义的数组创建某些元素数组
- 基于数组的列表 - 动态数组创建时出错
- 从 UTF-8 字节数组创建字符串?
- 是否可以在并行区域中为共享 2D 数组创建选定元素的线程本地副本?(共享,私有,障碍:OPenMP)
- C++ 从名称数组创建对象
- 从数组创建 Mat 时,'cv::Mat' 和 'int' 类型不兼容
- 从 std::数组创建十六进制代表
- 在 C++ 结构内声明的数组 A[1] 创建多个实例
- 为多维数组创建内存空间
- 如何使用任何类型的数组创建模板类并为其设置值?
- 从字符串数组创建一个字符数组
- 是否可以在不为该数组创建变量的情况下将数组作为参数传递到函数中?
- 使用类定义数组创建C++类
- 使用具有唯一随机数的结构数组创建多个对象
- 谷歌测试:无法从字符数组创建字符串
- 从 1D 数组创建 2D 数组
- 无法通过一个单向链表数组创建邻接列表
- 如何使用数组创建标准::函数
- 在C++中,返回从本地字符数组创建的字符串是否会导致内存泄漏或未定义的行为