为什么这是非法的,有哪些合乎逻辑的替代方案?
// State.h
class State {
public:
int a;
int b;
State z; // <-- this is this problem
// ... Functions ...
};
谢谢你。
因为,如果它被允许,每次你创建一个实例时,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
.
由于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.
不合逻辑,因为这将导致无限数量的状态 z ,因为z的每个实例都会有另一个 z 实例,依此类推。指针状态* z是允许的,因为它没有这样的限制
改用 a State *
。这使您可以在某个时候结束递归。