如何使用私有构造函数中的引用成员初始化类?

时间:2008-11-12 16:45:57

标签: c++ constructor reference

我正在为类创建一个接口包装器。类中的成员是一个引用(以避免复制大型结构)。如果我创建一个私有构造函数,那么初始化该引用以安抚编译器的最佳方法是什么?

struct InterfaceWrapper {
    InterfaceWrapper( SomeHugeStructure& src ):m_internal(src){};
    int someElement(void) const { return m_internal.someElement; };
private:
    InterfaceWrapper(){}  // initialize m_internal
    SomeHugeStructure& m_internal;
};

4 个答案:

答案 0 :(得分:4)

如果你真的需要在没有元素的情况下构造类,那么引用就不是你想要的了。

如果您使用引用的唯一理由是避免复制,我建议使用指针。 您可以简单地在常规构造函数中获取传递的引用的地址,并在私有构造函数中将其初始化为NULL。当对象的生命周期结束时,指针将是一个悬空指针,但对于引用也是如此......

或者,让公共构造函数采用智能指针并使用这样的智能指针作为成员,如果你担心生命周期。

当然,在类代码的其余部分中处理可能为NULL的指针。 (但你必须应对那个成员可能在参考案例中成为一个存根,所以这不是一个真正的问题)

答案 1 :(得分:4)

正如其他人所提到的,如果你的目的是阻止其他人调用默认构造函数,那么你根本不想提供一个体,并且声明它是不必要的,因为你有另一个构造函数而编译器不会为你生成它。

如果目的是限制对类的朋友的访问,那么你可能最好有一个指针(最好是智能指针)成员,并将其设置为NULL。

-

另外,我不确定你为什么把它变成一个结构而不是一个类。一般来说,当你将数据成员暴露为公共时,结构是有意义的,类似于C.在这种情况下,看起来你有一个传统的类,在这种情况下,C ++约定是使它成为一个类。 / p>

答案 2 :(得分:2)

如果您将默认ctor设为私有,以防止任何人使用它,那么就离开身体:

private:
    InterfaceWrapper();
    SomeHugeStructure& m_internal;

编译器会认为它是在其他地方定义的,并且链接器不会介意它除非有人试图使用它。

答案 3 :(得分:1)

私人监管人员有什么意义?如果m_internal没有引用有效对象,那么它如何有用呢?

m_internal->不会编译。那是指针语法,而不是参考。