2012-06-15 55 views
0

我有两个类,一个在另一个中,我想在外部类构造函数的主体中构造内部类。我有我认为应该是正确的代码,但它不起作用。该错误消息似乎告诉我没有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&)' 

第2行37是KVTest的构造函数声明 第347行是该构造函数中被调用的构造函数的行 第112行是VSL构造函数声明 头的第45行是{开始VSL类 我没有显式复制VSL的构造函数

+0

所有的构建和变量返回的对象的副本这个例子是私有的。这是问题吗? – pmr

回答

3

当您进入KVTest::KVTest正文的内部时,vsl已经被初始化;你不能再次调用构造函数。但没有默认的(即零参数)构造函数,因此编译器错误消息。

你有两个选择:

  1. 声明默认构造函数VSL
  2. 使用constructor initialisation list明确地初始化vsl。这通常会是这个样子:

    KVTest::KVTest(int argc, char *argv[]) 
    : vsl(foo, bar) 
    {} 
    

    如果需要执行涉及的临时变量等复杂的初始化,那么你应该考虑写一个返回VSL的私人助手功能。

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; 
}