-3

首先我想展示一些代码,也许它会有所帮助。

CBank *Bank;

COkno Okno(Bank);
CBohater Bohater(Bank);
CKlawiatura Klawiatura(Bank);
CWszystkiePlatformy WszystkiePlatformy(Bank);
Bank = new CBank(&Okno, &Bohater, &Klawiatura, &WszystkiePlatformy);

主要思想是将上述所有类(CBank除外)将它们分组,然后让分组的类相互访问。我不知道我这样做是否正确。当在类 COkno ... 中尝试指针上方的代码时,这些代码已经过时并且不存储正确的数据。

4

2 回答 2

3

您正在存储指向具有自动存储持续时间的对象的指针(至少,您可能很难从示例的发布方式中分辨出来)。当它们离开当前作用域时,指向它们的指针变得无效。

接下来,您将Bank一个指向CBank对象的指针传递给它们中的每一个,但您在初始化之前这样做了。制作了一个副本,当Bank稍后初始化时,它被设置为一个新值,但是您的其他对象仍然有一个无效指针的副本。馊主意。

你在这里有一个奇怪的依赖。您需要一个CBank指针来传递给这三个构造函数,但同时您需要将这三个对象传递给CBank构造函数。依赖是循环的,这是一个糟糕的设计。

您可以做的是更改CBank以在内部构造这些对象。如果不需要动态内存分配......好吧,不要使用它。如果需要,则在构造函数中或构造函数中添加new对象并在析构函数中释放它们(如果这样做,请不要忘记遵守三规则!)。 CBankCBank

问你自己; 这些依赖真的有必要吗?你能简化这种关系吗?

于 2012-06-11T18:16:07.667 回答
1

一个简化的版本是有 2 个试图相互引用的对象:

class A {
    A(A* other);
};

A* one = new A(two); // ?
A* two = new A(one);

(这里有一个类,你有不同的类——这并不重要)。

这显然是行不通的,因为在创建之前one不能引用。twotwo

除了两阶段初始化之外,恐怕没有合理的方法可以做到这一点。需要以某种方式创建对象,其中一个对象需要确认第二个对象尚不存在。

因此类似于:

class A {
    A(A* other);
    A();
    // ...
};

A* one = new A();
B* two = new A(one);
one->setOtherReference(two);

是的,这意味着两阶段初始化,即有一段时间one已创建但尚未完全初始化(等待setOtherReference()它需要运行)。

顺便说一句:您可以简化您的设计来避免这种情况!

于 2012-06-11T18:20:17.767 回答