我正在为类创建一个接口包装器。类中的成员是一个引用(以避免复制大型结构)。如果我创建一个私有构造函数,那么初始化该引用以安抚编译器的最佳方法是什么?
struct InterfaceWrapper {
InterfaceWrapper( SomeHugeStructure& src ):m_internal(src){};
int someElement(void) const { return m_internal.someElement; };
private:
InterfaceWrapper(){} // initialize m_internal
SomeHugeStructure& m_internal;
};
答案 0 :(得分:4)
如果你真的需要在没有元素的情况下构造类,那么引用就不是你想要的了。
如果您使用引用的唯一理由是避免复制,我建议使用指针。 您可以简单地在常规构造函数中获取传递的引用的地址,并在私有构造函数中将其初始化为NULL。当对象的生命周期结束时,指针将是一个悬空指针,但对于引用也是如此......
或者,让公共构造函数采用智能指针并使用这样的智能指针作为成员,如果你担心生命周期。
当然,在类代码的其余部分中处理可能为NULL的指针。 (但你必须应对那个成员可能在参考案例中成为一个存根,所以这不是一个真正的问题)
答案 1 :(得分:4)
正如其他人所提到的,如果你的目的是阻止其他人调用默认构造函数,那么你根本不想提供一个体,并且声明它是不必要的,因为你有另一个构造函数而编译器不会为你生成它。
如果目的是限制对类的朋友的访问,那么你可能最好有一个指针(最好是智能指针)成员,并将其设置为NULL。
-
另外,我不确定你为什么把它变成一个结构而不是一个类。一般来说,当你将数据成员暴露为公共时,结构是有意义的,类似于C.在这种情况下,看起来你有一个传统的类,在这种情况下,C ++约定是使它成为一个类。 / p>
答案 2 :(得分:2)
如果您将默认ctor设为私有,以防止任何人使用它,那么就离开身体:
private:
InterfaceWrapper();
SomeHugeStructure& m_internal;
编译器会认为它是在其他地方定义的,并且链接器不会介意它除非有人试图使用它。
答案 3 :(得分:1)
私人监管人员有什么意义?如果m_internal没有引用有效对象,那么它如何有用呢?
m_internal->不会编译。那是指针语法,而不是参考。