3

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

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

4 回答 4

4

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

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

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

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

于 2008-11-12T16:57:14.020 回答
4

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

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

--

另外,我不确定您为什么将其设为结构而不是类。通常,当您将数据成员公开为公共时,将某些东西设为结构是有意义的,类似于 C。在这种情况下,看起来您有一个常规类,在这种情况下,C++ 约定将使其成为一个类。

于 2008-11-12T17:44:10.197 回答
2

如果您将默认 ctor 设为私有以防止任何人使用它,那么只需离开正文:

private:
    InterfaceWrapper();
    SomeHugeStructure& m_internal;

编译器会认为它是在别处定义的,除非有人尝试使用它,否则链接器不会介意它不是。

于 2008-11-12T17:00:29.537 回答
1

私人演员的意义何在?如果 m_internal 没有引用一个有效的对象,它有什么用呢?

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

于 2008-11-12T16:58:41.897 回答