将对象实例化为不带默认构造函数的类成员
Instantiating an object as class member without default constructor
我是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),默认构造函数就会立即受到追捧。无论如何要避免这种情况?多谢。
Vertex v1(int j=1);
这声明了一个函数 v1
,它返回一个Vertex
并接受一个int
参数。你想要的是
Vertex v1(1);
此外,您需要使用初始化器列表,如其他答案所示:
Test(const Vertex & v1) : v(v1) {}
初始化Test::v
就像初始化Vertex::i
一样。(private
完全无关紧要!
因此,使用 Test::Test
的成员初始化列表:
Test(const Vertex & v1) : v(v1) {};
为了保持一致性,我还建议:
Vertex(const Vertex & v) : i(v.i) {};
尽可能初始化成员。
使用构造函数初始化列表:
Test(const Vertex & v1) : v(v1) {}
进入构造函数的主体(在{
和}
之间)后,所有数据成员都已初始化。如果不显式执行此操作,它们将默认初始化,这需要用户定义类型的可用默认构造函数。
接下来,您将在此处声明一个函数:
Vertex v1(int j=1);
你可能的意思是
Vertex v1(1);
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 继承:构造函数,初始化C++11中基类的类C数组成员
- C++-我可以创建另一个类的成员并在构造函数中使用它吗
- 如果基类包含双指针成员,则派生类的构造函数
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- constexpr构造函数需要常量成员函数时出现问题
- 如何在c++中定义以struct为数据成员的类中的构造函数
- 在作为静态成员包含在另一个类中的类的构造函数中使用 cout
- std::ofstream 作为类成员删除复制构造函数?
- c++构造函数成员初始化:传递参数
- C++初始化类实例时隐式调用类成员的构造函数
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 在构造函数中输入对象时C++类成员作用域
- 解释了构造函数成员初始化列表
- 构造函数成员初始值设定项跨成员列出,安全吗?
- C 构造函数成员分配优化
- 类内/构造函数成员初始化
- 在构造函数成员初始化之前调用成员函数的语法
- 非构造函数成员函数中的显式字符串行为