gpt4 book ai didi

c++ - 通过引用或指针共享对象

转载 作者:行者123 更新时间:2023-11-30 02:12:22 24 4
gpt4 key购买 nike

假设我有一个类型为 A 的对象,该对象具有 Initialize() 方法。该方法接收对象 B,该对象作为对象数据成员保存。B 对象在多个对象之间共享,因此 A 应该包含最初接收到的 B 对象而不是它的拷贝。

   class A 
{
public:
bool Initialize(B?? b);
private:
B?? m_B;
}

对象 B 必须存在。因此,我认为通过引用传递它,而不是通过指针传递并在 B 为 NULL 的情况下使 Initialize() 失败。

m_B 的唯一替代是指针 B 的类型(它不能是 B 的引用,因为 B 的初始化不是在 A c-tor 中完成的)。因此 Initialize 应该看起来像:

bool A::Initialize(B& b) 
{
m_B = &b;
....
}

这个方法可以吗?

更新:

  1. 代码不是新的,我只是想“修复”一些问题。实际上我不是在谈论一些具体的 A 和 B 类,而是在我的代码库中解决问题的方法。该代码广泛传递指向 B 的指针,并在它为 NULL 时在 Initialize() 中对其进行验证。

  2. 将 B 传递给 A 的委托(delegate)人也不总是一个好的选择。还有其他传递给 A 的参数,这些参数在 A 创建时不存在。因此,我不希望将部分参数传递给 A c-tor 而将其余参数传递给 A::Initialize()。

  3. shared_ptr 也可以是“NULL”,因此将其传递给 A::Initialize() 与仅将指针传递给 B 没有什么不同,在这方面,如果 B 是必需的,则 Initialize() 的签名不会声明或不。在我的例子中是,我想通过传递对 B 的引用来表达它。

  4. 我们的代码目前根本没有使用 boost。所以,虽然 shared_ptr 比只传递原始指针更好的解决方案,我提出的解决方案可以被认为是不好的,但仍然是解决方案。

最佳答案

如果 B 是可选的,那么它可以表示为一个指针。如果需要 B,则应将其表示为引用。

如果可能,尽量避免使用初始化方法进行“两阶段构建”。如果无法做到这一点,那么在 A 的内部,您需要将 B 视为可选的,因此将其存储为指针并在您可能想要使用它的任何地方进行测试。

如果您的初始化方法(或者,理想情况下,构造函数)需要一个 B,那么您应该将其作为引用传入。

这一切都假设您知道谁实际拥有 B;也许 B 拥有 A 的实例并使用对自身的引用来初始化它们,或者 B 的所有者也可能拥有引用该 B 实例的所有 A 实例。

如果 A 的对象共同拥有 B,那么您应该使用类似 boost::shared_ptr 的东西来明确共享所有权;假设B是动态分配new的。

关于c++ - 通过引用或指针共享对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1855951/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com