0

为什么这是非法的,有哪些合乎逻辑的替代方案?

// State.h
class State {

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

// ... Functions ...

};

谢谢你。

4

4 回答 4

7

因为,如果它被允许,每次你创建一个实例时,State你都会创建一个实例,State然后创建一个实例State,并且,那个也需要一个State实例,所以它创建一个实例State......等等。

它还会在试图找出sizeof(State). 善待你的编译器。

改为保持一种指针,你会没事的。State附带说明一下, a拥有自己的 (public)真的有意义State吗?我的意思是,我确实喜欢看到如下代码行,但它可能会变得荒谬......

if(state.z->z->z->z->z->z->z->z == some_state) {
    // we found the right state!
}

如果您尝试创建单例,请将您的构造函数设为私有并添加一个静态get_instance函数,该函数返回State.

于 2013-03-07T03:51:44.070 回答
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.
于 2013-03-07T03:59:22.630 回答
1

不合逻辑,因为这将导致无限数量的状态 z ,因为z的每个实例都会有另一个 z 实例,依此类推。指针状态* z是允许的,因为它没有这样的限制

于 2013-03-07T03:51:33.507 回答
0

改用 a State *。这使您可以在某个时候结束递归。

于 2013-03-07T03:52:05.117 回答