我的设计包括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类型& ;,你必须设置一个有效的值
施工时间,因为它们不是空的,它们并不明显
这样做的方式.
此外,虽然这不是你问题的一部分,但我会记录谁真正拥有记忆.我喜欢使用std :: unique_ptr<>这是因为所有权显而易见.
您更新的示例:
class C {
private:
const A* a;
const B* b;
public:
void setA(const A* a);
void setB(const B* b);
}