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

时间:2016-02-22 23:38:42

标签: c++ pointers object reference unique-ptr

我的设计包含3个类作为我的数据结构。让我们调用类ABC

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

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

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

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

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

我的问题如下:

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

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

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

2 个答案:

答案 0 :(得分:2)

  1. 避免使用原始指针是一种很好的现代C ++风格。看到 有关详细信息,请参阅Effective Modern C++ by Scott Meyers的第4章。 但是,这并不意味着您不能使用指针。我还建议阅读Effective C ++,More Effective C ++和Effective STL。

  2. 如此命名,引用或指针都指向 对同一个对象。在封面下,你正在复制内存 有问题的对象的地址。

    现在使用const指针(或引用),对象本身并没有 必须是常数。如果函数采用const类型*或const type&,类型系统将为你提供const。

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

  3. 所以在这种情况下,实际的内存是由一个 的std ::的unique_ptr<>你会传递一个引用或指针 物体。在您的情况下,发送地址/指针是 唯一合理的事情。你想要初始化 在构造上的值为nullptr。然后你就能分辨出来了 调用者分配了一个值,因为指针不为null。如果 你想使用const类型&amp ;,你必须设置一个有效值 施工时间,因为它们不是空的,它们并不明显 这样做的方法。

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

    您的更新示例:

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

答案 1 :(得分:0)

  

问题是我不希望C类对象能够修改a和b。实际上,我只需要知道哪个a和b对应于特定的c。

使用const指针:

A const* a;
A const* b;

然后尊重他们,他们将成为对象。

使用指针而不是引用,就像在A类或B类中有C实例一样,您将收到错误。使用指针避免了

(1)没关系;你应该使用指针,因为在传递引用时更容易看到。例如:

function(a); // Not sure if it is a reference
function(&a); // You know it is that actual object

(2)推导const指针,它将使它成为const"引用"