将对象实例化为没有默认构造函数的类成员

时间:2014-02-24 22:16:44

标签: c++

我是C ++的新手。我想将一个对象声明为另一个类的私有成员。是否可以使用默认构造函数完成此对象的实例化?此处列出了示例代码:

class Vertex{
  int i;
public: 
  Vertex(int j):i(j){};
  Vertex(const Vertex & v){i=v.i;};
}

class Test{
  Vertex v;
public:
  Test(const Vertex & v1){v(v1);}
}

int main()
{//some code here;
  Vertex v1(int j=1);
  Test(v1); // *error: no matching function for call to 'Vertex::Vertex()'*
  return 0;
}

在我看来,一旦将对象声明为私有类成员(例如Vertex v),就会立即寻求默认构造函数。无论如何要避免这种情况?非常感谢。

3 个答案:

答案 0 :(得分:3)

Vertex v1(int j=1);

这声明了一个函数v1,它返回Vertex并获取int参数。你想要的是

Vertex v1(1);

此外,您需要使用初始化列表,如其他答案所示:

Test(const Vertex & v1) : v(v1) {}

答案 1 :(得分:1)

使用构造函数初始化列表:

Test(const Vertex & v1) : v(v1) {}

一旦进入构造函数体({}之间),所有数据成员都已初始化。如果您没有显式地执行此操作,则会默认初始化,这需要用户定义类型的可用默认构造函数。

接下来,您将在此处声明一个功能:

Vertex v1(int j=1);

你可能意味着什么

Vertex v1(1);

答案 2 :(得分:1)

在初始化Test::v时初始化Vertex::i。 (它是private完全不相关!)

所以,使用Test::Test的成员初始化列表:

Test(const Vertex & v1) : v(v1) {};

为了保持一致性,我还建议:

Vertex(const Vertex & v) : i(v.i) {};

尽可能初始化成员。