gpt4 book ai didi

c++ - 如何创建对对象的常量引用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:08:32 25 4
gpt4 key购买 nike

我的设计包含 3 个类作为我的数据结构。我们将类称为 ABC

在解析我的输入时,我必须实例化 ABC 的对象。 C 类的每个对象都需要跟踪 AB 类中的相应对象。我当前的实现如下所示:

class C {
private:
A* a;
B* b;
public:
void setA(A* a);
void setB(B* b);
}

当我使用 new 创建 AB 的对象时,我分配了 ab 运算符。问题是我不希望类 C 的对象能够修改 ab。其实我只需要知道哪个ab对应一个具体的c即可。

一种解决方案是将ab 定义为const 指针/对象引用。但是,在对象引用的情况下,我需要在声明它们后立即定义它们。问题是我正在解析多个文件,并且在定义它们时无法为 ab 分配正确的引用。换句话说,ab 在我的程序中是在不同的时间创建的,当我创建 c 时可能不可用。

最近,我了解到最好尽可能避免使用原始指针,这就是我尝试使用对象引用而不是指针来实现它的原因。实际上,这让我很难确定在程序的不同阶段使用哪一个。

我的问题如下:

1) 在这个特定问题中使用对象引用而不是指针更好吗?

2) 虽然这种方法适用于指针,但如果我更喜欢使用对象引用而不是指针,我应该如何为 ab 分配常量引用?

3) 如果我对ab 使用unique_ptr,这个问题的解决方案是什么?

最佳答案

  1. 避免使用原始指针是很好的现代 C++ 风格。看Effective Modern C++ by Scott Meyers的第4章了解详情。但是,这并不意味着您不能使用指针。我还建议阅读 Effective C++、More Effective C++ 和 Effective STL。

  2. 所以命名法明智,引用或指针都指向到同一个对象。在幕后,你正在复制内存相关对象的地址。

    现在要使用对象本身不使用的 const 指针(或引用)必须是常量。如果函数采用 const 类型* 或 consttype&,类型系统将为您添加常量。

    我想你想要的是一个 const 指针。这里的项目是指向的是 const,而不是内存地址,所以你没有初始化构造参数。 const 的问题引用是您将其初始化为什么? const 类型* 可以在构造时设置为 nullptr,但引用没有具有空值的方法。我会说这在这里很重要,因为您将希望能够判断调用者是否为 a 分配了一个值或者 b。如果他们没有,并且您正确地初始化了成员变量到 nullptr,您可以对其进行测试以了解它们不是设置。

  3. 所以在这种情况下,实际拥有的内存std::unique_ptr<> 并且您将传递一个引用或指针到物体。在您的情况下,发送地址/指针是唯一合理的做法。你会想要初始化构造时为 nullptr 的值。然后你就可以判断是否调用者分配了一个值,因为指针不为空。如果你想使用常量类型&,你必须设置一个有效值构建时间,并且由于它们不为null&,因此它们不明显方法。

此外,虽然这不是您问题的一部分,但我会记录谁真正拥有内存。我喜欢使用 std::unique_ptr<> 的一件事是它使所有权显而易见。

您更新的示例:

class C {
private:
const A* a;
const B* b;
public:
void setA(const A* a);
void setB(const B* b);
}

关于c++ - 如何创建对对象的常量引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35566083/

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