我的设计包含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);
}
当我使用a
运算符创建b
和A
的对象时,我会分配B
和new
。问题是我不希望类C
的对象能够修改a
和b
。实际上,我只需要知道哪个a
和b
对应于特定的c
。
一种解决方案可能是将a
和b
定义为const
指针/对象引用。但是,在对象引用的情况下,我需要在声明它们时立即定义它们。问题是我正在解析几个文件,当我定义它们时,我无法为a
和b
分配正确的引用。换句话说,a
和b
是在我的计划中的不同时间创建的,在我创建c
时可能无法使用。
最近,我读到尽可能避免原始指针更好,这就是为什么我尝试使用对象引用而不是指针来实现它。实际上,这让我很难弄清楚在我的程序的不同阶段使用哪一个。
我的问题如下:
1)在这个特定问题中使用对象引用而不是指针是否更好?
2)虽然这种方法适用于指针,但如果我更喜欢使用对象引用而不是指针,我该怎么做才能为a
和b
分配常量引用?
3)如果我对unique_ptr
和a
使用b
,那么这个问题的解决方案是什么?
答案 0 :(得分:2)
避免使用原始指针是一种很好的现代C ++风格。看到 有关详细信息,请参阅Effective Modern C++ by Scott Meyers的第4章。 但是,这并不意味着您不能使用指针。我还建议阅读Effective C ++,More Effective C ++和Effective STL。
如此命名,引用或指针都指向 对同一个对象。在封面下,你正在复制内存 有问题的对象的地址。
现在使用const指针(或引用),对象本身并没有 必须是常数。如果函数采用const类型*或const type&,类型系统将为你提供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);
}
答案 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"引用"