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&)'

第 237 行是 KVTest 构造函数声明 第 347 行是该构造函数中调用 vsl 构造函数的行 第 112 行是 VSL 构造函数声明 标题的第 45 行是 { 开始 VSL 类 我没有显式的 VSL 复制构造函数

4

2 回答 2

3

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

你有两个选择:

  1. 为 声明一个默认构造函数VSL
  2. vsl使用构造函数初始化列表显式初始化。这通常看起来像这样:

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

    如果您需要执行涉及临时变量等的复杂初始化,那么您应该考虑编写一个返回VSL.

于 2012-06-15T22:57:54.317 回答
1

首先,它不是“内部类”,它是数据成员。

现在将您的代码与声明和初始化 a 进行比较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;
}
于 2012-06-15T23:01:43.520 回答