2008-11-12 84 views
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

正如其他人所提到的,如果你的目的是为了防止他人从调用默认的构造函数,那么你不想提供身体所有,并宣布这是不必要的,因为你有另一个构造函数,编译器荣获”为你生成它。

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

-

而且,我不知道你为什么做这样的结构,而不是一类。一般来说,当你将数据成员公开为public时,结构是有意义的,类似于C.在这种情况下,看起来你有一个常规的类,在这种情况下,C++约定就是使它成为一个类。

4

如果你确实需要构造没有元素的类,那么引用不是要走的路。

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

或者,让公共构造函数带一个智能指针并使用这样的智能指针作为成员,关心生命。

当然而且,配合指针可能是NULL在该类的代码的其余部分。 (但你不得不应付成员可能是在基准情况下也存根,所以这不是一个真正的问题)

1

什么是私有构造函数的意义呢?如果m_internal没有引用一个有效的对象,那它有什么用处?

另外,m_internal->将无法编译。这是指针语法,而不是参考。

2

如果您正在默认的构造函数私有,以防止任何人使用它,把它留在身躯:

private: 
    InterfaceWrapper(); 
    SomeHugeStructure& m_internal; 

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

+0

如果您定义了任何其他构造函数,编译器不会自动生成默认构造函数。所以在这种情况下,它可以安全地从代码中删除。 – 2008-11-12 17:08:41

相关问题