如何隐藏消费者的默认构造函数?我试图私下写,但有编译问题。
解决方案是:
class MyInterface
{
public:
MyInterface(SomeController *controller) {}
};
class Inherited : public MyInterface
{
private:
Inherited () {}
public:
Inherited(SomeController *controller)
{
}
};
答案 0 :(得分:10)
在您的情况下,由于您已经提供了一个带有一个参数SomeController*
的构造函数,因此编译器不会为您提供任何默认构造函数。因此,默认构造函数不可用。
即,
MyInterface a;
会导致编译器说没有合适的构造函数。
如果你想让构造函数显式不可用,那么就像private一样。
您发布的代码编辑:
您需要显式调用基类MyInterface
构造函数(带有单个参数)。否则,默认情况下,派生类构造函数(Inherited
)将查找缺少的Base类默认构造函数。
class Inherited:public MyInterface { 私人的: Inherited(); 公共:
Inherited(SomeController *controller):MyInterface(controller)
{}
};
答案 1 :(得分:4)
根本就不要把它放进去。具有非默认ctor的类没有编译器提供的默认构造函数。它有一个编译器生成的副本构造函数;继承自boost::noncopyable
以删除它。
答案 2 :(得分:1)
写作:
private:
MyInterface();
以两种方式完成这一操作:首先,除了朋友之外没有人可以访问它,但更好的是:如果朋友确实试图访问它,链接器会因为没有实现而抱怨。
同样的技巧适用于复制构造函数和赋值运算符。