构造函数中的后期构造

时间:2012-06-15 22:53:47

标签: c++ constructor

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

2 个答案:

答案 0 :(得分:3)

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

您有两种选择:

  1. 声明VSL
  2. 的默认构造函数
  3. 使用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;
}