首先,我想展示一些代码,也许会有所帮助。
CBank *Bank;
COkno Okno(Bank);
CBohater Bohater(Bank);
CKlawiatura Klawiatura(Bank);
CWszystkiePlatformy WszystkiePlatformy(Bank);
Bank = new CBank(&Okno, &Bohater, &Klawiatura, &WszystkiePlatformy);
主要思想是将所有上述类放在CBank之外,它们将对它们进行分组,然后让分组的类相互访问。我不知道我是否正确行事。当尝试上面的代码时,COkno ...等类中的指针已经过时,并且不存储正确的数据。
答案 0 :(得分:3)
您正在存储指向具有自动存储持续时间的对象的指针(至少,您可能很难分辨您的示例发布方式)。当他们离开他们当前的范围时,指针变为无效。
接下来,将Bank
,一个指向CBank
对象的指针传递给每个对象,但是在初始化之前就这样做了。制作副本,并在稍后初始化Bank
时将其设置为新值,但是其他对象仍然有一个无效指针的副本。不好的主意。
你有一个奇怪的依赖。您需要一个CBank
指针来传递给这三个构造函数,但同时您需要将这三个对象传递给CBank
构造函数。依赖性是循环的,这是一个糟糕的设计。
您可以做的是更改CBank
以在内部构建这些对象。如果不需要动态内存分配......好吧,不要使用它。如果需要,则new
向上CBank
或CBank
的构造函数中的对象,并在析构函数中释放它们(不要忘记遵守rule of three if你做这个!)。
问问自己;这些依赖真的是必要的吗?你能简化这种关系吗?
答案 1 :(得分:1)
简化版本将有2个试图互相引用的对象:
class A {
A(A* other);
};
A* one = new A(two); // ?
A* two = new A(one);
(这里有一个班级,你有不同的班级 - 这无关紧要。)
这显然不起作用,因为one
在创建two
之前无法引用two
。
除了两阶段初始化之外,我担心没有合理的方法可以做到这一点。需要以某种方式创建对象,其中一个需要确认第二个对象尚不存在。
因此像:
class A {
A(A* other);
A();
// ...
};
A* one = new A();
B* two = new A(one);
one->setOtherReference(two);
是的,这意味着两阶段初始化,即有一段时间one
已创建但尚未完全初始化(等待它需要运行的setOtherReference()
)。
BTW:您可以简化设计以避免这种情况!