"object container"和指针
"object container" and pointers
首先,我想展示一些代码,也许它会有所帮助。
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
CBank
或CBank
构造函数中的对象,并在析构函数中释放它们(如果这样做,请不要忘记遵守三法则!
问问自己;这些依赖关系真的有必要吗? 你能简化这种关系吗?
简化版本是有 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()
才能运行)。
顺便说一句:您有可能只是简化设计以避免这种情况!
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- C++ "oldstyle container ":指针/数组/新 - 可能误会?
- 无法将"this"指针从"const container"<T>转换为"container<T> &"
- "object container"和指针