在下面的代码中,B类有一个类型为A (varA1)的成员。我想要创建一个B类对象,其中成员varA1打算在A类中使用非默认构造函数A(int v1)。
#include <iostream>
using std::cout; using std::endl; using std::string;
class A {
public:
A() { cout << "A default constructor" << endl;}
A(int v1);
private:
int var1;
};
A::A(int v1) {
cout << "A int constructor" << endl;
var1 = v1;
}
class B {
public:
B() { cout << "B default constructor" << endl;}
B(int v1);
private:
int var1;
A varA1;
};
B::B(int v1) {
cout << "B int constructor" << endl;
var1 = v1;
A varA1(int v1);
}
int main()
{
A TestA(1);
B TestB(1);
return 0;
}然而,当我运行上面的代码时,我得到了以下输出:
A int constructor
A default constructor
B int constructor我一定是做错了什么。为了使B类在A类中使用非默认构造函数A(int v1),我需要更改什么?
我使用的是ubuntu 14.04LTS。GNU G++ 4.9和5.1都给出了相同的结果。
提前感谢您的阅读和回答。
发布于 2015-10-31 20:40:13
使用成员初始化列表
B::B(int v1) : var1(v1), varA1(v1) {
cout << "B int constructor" << endl;
}请注意,成员的初始化(构造)顺序与类中声明的顺序相同,因此成员初始化列表中的切换顺序不会更改构造发生的顺序(希望编译器会警告您这一点)。如果您尝试从var1构造var1,那么这个小细节就变得非常重要,而var1是在类定义中的varA1之后声明的。
顺便说一句,这一行(在B::B(int v1)构造函数中)都是这样的:
A varA1(int v1);向前声明一个名为varA1的函数,该函数接受int参数并返回A对象。这与最烦人的解析是半相似的,尽管这并不是最令人烦恼的解析。
发布于 2015-10-31 20:45:22
您可以在B::B(int)构造函数中使用初始化程序列表:
B::B(int v1) : varA1(v1) {
cout << "B int constructor" << endl;
var1 = v1;
}发布于 2015-10-31 21:51:53
如果不需要默认的ctor,则可以使用
A(void) = delete; 但是请注意,您可以临时添加此声明作为诊断度量,以便让编译器通知您它希望使用默认ctor的代码。
通过替换
A() { std::cout << "A default constructor" << std::endl;}使用
A() = delete;编译器会抱怨B::B(int v1)正文中使用了删除的函数'A::A()‘。
因此,简单地检查了B的第二个数据属性,即“B::varA1 1”,使用A的默认ctor (现在删除)。
通过显式调用B ctor的初始化程序列表中的"varA1 (0)“,您还可以考虑‘修复’B ctor不使用A的默认ctor。
https://stackoverflow.com/questions/33456355
复制相似问题