我在C ++(对于一个类)的单例类中工作了很多,现在对于一个非类项目,我试图使用继承的类。
出于某种原因,我对构造函数链非常重视。
请考虑以下事项:
class SuperClass
{
string privateKey;
string publicKey;
string name;
public:
enum Key {PUBLIC, PRIVATE};
SuperClass(Key, string);
};
SuperClass::SuperClass(Key key, string theKey)
{
switch(key)
{
case PUBLIC: publicKey = theKey;
break;
case PRIVATE: privateKey = theKey;
break;
}
}
class SubClass : private SuperClass
{
public:
SubClass(string key);
};
SubClass::SubClass(string key)
: SuperClass(SuperClass::PUBLIC, key) // "SubClass" will only interact with the public key, in this case.
{
cout << "I'm instantiated!" << endl;
}
int main()
{
SubClass example ("thisIsThePublicKey");
return 0;
}
编译时,我收到以下错误:
error: no matching function ncall to SuperClass::SuperClass()
note: candidates are: SuperClass::SuperClass(SuperClass::Key, std::string)
为什么我会这样?我没有使用它说是候选人的构造函数吗? 我觉得我已经阅读了关于构造函数链的每个教程,但我仍然没有得到我应该以不同方式做的事情。
感谢您的帮助!
答案 0 :(得分:3)
我认为您没有为您的示例发布所有相关代码,因为上面的代码使用g ++为我编译。
那说,但是,我可以从错误消息中猜出Subclass在某个地方有一个默认构造函数,或者你还没有在你的例子中发布的其他第二个构造函数,定义如下:
SubClass::SubClass() // No argument constructor
{
cout << "Default constructor (no initialization)." << endl;
}
这将隐式尝试调用SuperClass :: SuperClass()默认构造函数。通常,如果您根本不提供任何构造函数,C ++将为您生成默认构造函数。但是,由于您已经定义了一个为SuperClass提取参数的构造函数,因此C ++不会为它生成默认构造函数。
另一种可能性是:你创建了SuperClass的另一个子类,没有构造函数,因此C ++正在生成一个隐式的默认构造函数。但是,C ++生成的隐式构造函数无法找到要调用的默认SuperClass构造函数。
答案 1 :(得分:1)
我相信你忘了继承你的超级班:
class SubClass
应该是:
class SubClass : public SuperClass
答案 2 :(得分:0)
首先,我在SubClass定义中看不到指定继承的位置。公共继承必须是这样的:
class SubClass : public SuperClass
{
// definition
}
答案 3 :(得分:0)
您必须继承SuperClass
:
class SubClass : public SuperClass
{
public:
SubClass(string key);
};
如果我使用私有继承,你的例子编译也很好。