我有两个类,一个在另一个中,我想在外部类构造函数的主体中构造内部类。我认为应该是正确的代码,但它不起作用。错误消息似乎告诉我没有VSL :: VSL()匹配我的调用,但它似乎是正确的原型。
代码看起来像这样:
标题中的:
class VSL
{
VSL(vector<string> &v, string &s);
};
class KVTest
{
VSL vsl;
KVTest(int argc, char *argv[]);
};
身体:
KVTest::KVTest(int argc, char *argv[]) {
vector<string> v;
string s;
vsl(v, s);
}
此操作失败,并显示以下错误消息:
src/util/kv-test/kv-test.cpp: In constructor 'KVTest::KVTest(int, char**)':
src/util/kv-test/kv-test.cpp:237: error: no matching function for call to 'VSL::VSL()'
src/util/kv-test/kv-test.cpp:112: note: candidates are: VSL::VSL(std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, std::string&)
src/util/kv-test/kv-test.h:45: note: VSL::VSL(const VSL&)
src/util/kv-test/kv-test.cpp:347: error: no match for call to '(VSL) (std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, std::string&)'
第237行是KVTest构造函数声明 第347行是调用vsl构造函数的构造函数中的行 第112行是VSL构造函数声明 标题的第45行是{启动VSL类 我没有VSL的显式复制构造函数
答案 0 :(得分:3)
当你进入KVTest::KVTest
的身体时,vsl
已被初始化;你不能再次调用构造函数。但是没有默认(即零参数)构造函数,因此编译器错误消息。
您有两种选择:
VSL
。使用constructor initialisation list明确初始化vsl
。通常看起来像这样:
KVTest::KVTest(int argc, char *argv[])
: vsl(foo, bar)
{}
如果您需要执行涉及临时变量等的复杂初始化,那么您应该考虑编写一个返回VSL
的私有辅助函数。
答案 1 :(得分:1)
首先,它不是“内部类”,而是数据成员。
现在将您的代码与声明和初始化int
:
int i = 0;
您无法通过撰写代码来创建int
:
i(0);
同样,这不会构建vsl
:
vsl(v, s);
它已经构造在那一点上,它在构造函数的主体开始之前构造,或者如果你有一个默认构造函数允许它构造而没有任何参数。
要构建一个对象,你必须声明它:
VSL vsl(v, s);
但是对于已经声明的成员变量,所以你不能在构造函数体中做到这一点。
如果你有一个默认构造函数,你可以通过为它赋予一个新值来更新构造函数体中的变量:
vsl = VSL(v, s);
只要您的类型具有正确编写的赋值运算符。
或者您可以在构造函数初始化列表中的正确时间初始化它:
KVTest::KVTest(int argc, char *argv[])
:vsl( createVSL() )
{
}
这会将其创建为createVSL()
VSL createVSL()
{
vector<string> v;
string s;
VSL vsl(v, s);
return vsl;
}