为什么这是非法的,有什么合理的选择?
// State.h
class State {
public:
int a;
int b;
State z; // <-- this is this problem
// ... Functions ...
};
谢谢。
答案 0 :(得分:7)
因为,如果允许,每次创建State
的实例时,您都会创建一个State
的实例,然后创建State
的实例,以及一个人也需要State
,因此它会创建State
的实例......依此类推。
它还会在尝试找出sizeof(State)
时将编译器发送到无限递归。对你的编译器很好。
保持一种指针,你会没事的。另一方面,State
拥有自己的(公共)State
真的有意义吗?我的意思是,我喜欢看到如下代码,但它可能会变得荒谬......
if(state.z->z->z->z->z->z->z->z == some_state) {
// we found the right state!
}
如果您正在尝试创建单例,请将构造函数设为私有,并添加一个静态get_instance
函数,该函数返回State
的唯一(静态)实例。
答案 1 :(得分:2)
由于z
是一个局部变量,因此在扫描整个State
类之前,您无法知道需要多少存储空间。由于State
取决于它自己,你将无限地递归。
基本上这是编译器中发生的事情:
I see a class state. Okay!
I now see a member variable a. Okay! Let's add 4 bytes to the size of our state
I now see a member variable b. Okay! Let's add 4 bytes to the size of our state
I now see a State. Okay! Let's see, our current size is 4 + 4,
now let's add the size of State to that, which is... um... ????
另一方面,指针在编译时具有已知的大小(通常为4个字节,但这取决于您的体系结构。)这样,当您不知道某个内容的大小时,您始终可以指向它因为尺寸不重要。
这就是编译器在那时发生的事情:
I see a class state. Okay!
I now see a member variable a. Okay! Let's add 4 bytes to the size of our state
I now see a member variable b. Okay! Let's add 4 bytes to the size of our state
I now see a State*. Okay! Let's add 4 bytes to the size of our state
I now see that class state has ended. Its size is 4 + 4 + 4 = 12.
I can now do State z; It will take 12 bytes of space.
答案 2 :(得分:1)
不合逻辑,因为这将以无限数量的状态z 结束,因为 z 的每个实例都会包含 z 的另一个实例,等等。指针 State * z 是允许的,因为它没有这样的限制
答案 3 :(得分:0)
请改用State *
。这可以让你在某个时候结束递归。