"object container"和指针

"object container" and pointers

本文关键字:指针 container object      更新时间:2023-10-16

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

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

主要思想是放置上述所有类,除了 CBank 之外,CBank 将将它们分组,然后让分组的类相互访问。我不知道我的做法是否正确。在类 COkno 中尝试指针上方的代码时...等已过时,不能存储正确的数据。

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

接下来,您将 Bank 传递给每个对象的指针,该指针指向每个对象的CBank对象,但在初始化之前执行此操作。 将创建一个副本,稍后初始化Bank时,该副本将设置为新值,但其他对象仍具有无效指针的副本。 坏主意。

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

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

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

简化版本是有 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()才能运行)。

顺便说一句:您有可能只是简化设计以避免这种情况!