简单的C ++声明问题

时间:2013-03-07 03:48:53

标签: c++ class pointers

为什么这是非法的,有什么合理的选择?

// State.h
class State {

public:
int a;
int b;
State z; //  <-- this is this problem

// ... Functions ...

};

谢谢。

4 个答案:

答案 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 *。这可以让你在某个时候结束递归。