"对象容器"和指针

时间:2012-06-11 18:12:28

标签: c++ object pointers

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

CBank *Bank;

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

主要思想是将所有上述类放在CBank之外,它们将对它们进行分组,然后让分组的类相互访问。我不知道我是否正确行事。当尝试上面的代码时,COkno ...等类中的指针已经过时,并且不存储正确的数据。

2 个答案:

答案 0 :(得分:3)

您正在存储指向具有自动存储持续时间的对象的指针(至少,您可能很难分辨您的示例发布方式)。当他们离开他们当前的范围时,指针变为无效。

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

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

您可以做的是更改CBank以在内部构建这些对象。如果不需要动态内存分配......好吧,不要使用它。如果需要,则new向上CBankCBank的构造函数中的对象,并在析构函数中释放它们(不要忘记遵守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:您可以简化设计以避免这种情况!