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

我的设计包括3个类作为我的数据结构.我们称之为A,B和C类.

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

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

当我使用new运算符创建A和B的对象时,我分配a和b.问题是我不希望C类对象能够修改a和b.实际上,我只需要知道哪个a和b对应于特定的c.

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

最近,我读到最好尽可能避免使用原始指针,这就是为什么我试图使用对象引用而不是指针来实现它.实际上,这让我很难弄清楚在我的程序的不同阶段使用哪一个.

我的问题如下:

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

2)虽然这种方法适用于指针,但如果我更喜欢使用对象引用而不是指针,我该怎么做才能为a和b分配常量引用?

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

最佳答案 >避免使用原始指针是一种很好的现代C风格.看到

有关详细信息,请参见第
Effective Modern C++ by Scott Meyers章.

但是,这并不意味着您不能使用指针.我还建议阅读有效C,更有效C和有效STL.

>明智的命名法,引用或指针都指向

对同一个对象.在封面下,你正在复制内存

有问题的对象的地址.

现在使用const指针(或引用),对象本身不会
必须是常数.如果函数采用const类型*或const
类型&,类型系统将为您提供const.

我认为你想要的是一个const指针.这里的项目是
指向是const,而不是内存地址,所以你没有
初始化施工参数. const的问题
参考是你将它初始化为什么? const类型*可以
在构造上设置为nullptr,但引用没有
获得空值的方法.我会说这很重要因为
您将希望能够判断调用者是否为a分配了值
或b.如果他们没有,并且您正确初始化了该成员
变量到nullptr,你可以测试它,知道它们不是
组.
>所以在这种情况下,实际的内存由一个人拥有
的std ::的unique_ptr<>你会传递一个引用或指针
物体.在您的情况下,发送地址/指针是
唯一合理的事情.你会想要初始化
在构造上的值为nullptr.然后你就能分辨出来
调用者分配了一个值,因为指针不为null.如果
你想使用const类型&amp ;,你必须设置一个有效的值
施工时间,因为它们不是空的,它们并不明显
这样做的方式.

此外,虽然这不是你问题的一部分,但我会记录谁真正拥有记忆.我喜欢使用std :: unique_ptr<>这是因为所有权显而易见.

您更新的示例:

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