我是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),就会立即寻求默认构造函数。无论如何要避免这种情况?非常感谢。
答案 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) {};
尽可能初始化成员。