在C++中,类是否可以包含指向构造函数中初始化的同一类的指针?
In C++, can a class include a pointer to the same class that's initialized in the constructor?
我知道一个类不能有同一个类的成员,例如
class Sample {
int a = 0;
Sample s; // error, object would need infinite size
};
但是为什么有指针就可以了呢?
class Sample {
// this compiles, but isn't it essentially the same
// as above?
Sample() { s = new Sample(); }
int a = 0;
Sample *s;
};
允许将指针作为成员,因为指针具有固定大小(32 位应用中为 4 个字节,64 位应用中为 8 个字节),因此编译器可以在编译时知道Sample
的完整大小,它不依赖于指针在运行时指向的内容。
在Sample
构造函数中创建Sample
实例不是语法错误,因此编译器允许这样做,但它会在运行时导致无限递归循环。 所以不要这样做。
一般来说,编译器擅长检测类型问题,而不擅长检测值问题。
在后一种情况下,有时是因为它不能(它怎么能知道十年后发生的事情?),有时是因为它不能真正被打扰(阅读:标准不要求它做数学上困难的事情,因为那会有点卑鄙)。
在第一个示例中,递归定义是由类型显示的问题。编译器始终知道您已经做到了。事实上,它在物理上没有办法创建一个与源代码匹配的程序:这样的东西在数学上是不可能存在的——它会永远持续下去。
但是运行时间接寻址开辟了新的机会!指针不必指向任何内容。您可以不初始化s
,或将其初始化为nullptr
,这很好。您可以将选择留给if
,并拨打rand()
电话。编译器能做的最好的事情就是分析构造函数体,看看你是否递归地实例化Sample
。但是,最终,这比编译器或标准愿意在1中投入的精力要多,因此它成为您的问题。
简而言之:事情就是这样。
1.如果您的构造函数主体在另一个翻译单元中怎么办?这次不是,但C++喜欢一般规则...
class Sample {
int a = 0;
Sample s; // error, object would need infinite size
};
Sample
的定义在你声明Sample s;
的地方尚未完成,因此编译器不知道它应该分配多少大小......它不知道什么是sizeof(Sample)
.
指向自身的指针,即Sample *s;
是标准大小,具体取决于编译代码的目标平台。
- 无法将指向类的成员函数的函数指针作为参数传递给同一类的另一个成员函数
- 如何获取同一类函数中类成员的函数指针?
- 在C++中,类是否可以包含指向构造函数中初始化的同一类的指针?
- 如何使用箭头指针打印出一类数组对象,这些对象中有多个分数
- 如何在具有同一类指针的类中编写布尔运算符?
- (C )当在同一类中调用时,污点指针返回正确的值,而从MAIN调用时为0
- 如何使用nullptr初始化同一类对象的静态指针数组?
- 在同一类中调用函数指针
- 一个类应使用功能指针调用另一类的方法
- 指针在同一类(C )中的成员功能
- 为什么在同一类中使用不同的(共享_ptr和正常)指针构造函数,我会得到不同的结果
- 同一类的不同方法中的指针向量
- 将一个指向成员函数的指针强制转换为同一类的另一个指针
- 是否可以将"成员函数指针"指向同一类中的成员函数
- 当我们把指针从一个对象复制到同一类的另一个对象时,我们到底想要什么
- C++ 其他类中的类,指针指向第一类
- 初始化类的函数指针成员到同一类的函数成员
- C++类构造函数使用指向同一类对象的指针
- C++:如何调用属于同一类的成员函数指针
- 将指向同一类的私有成员指针设置为NULL