我有2个类A和B.我试图使用B类的默认构造函数来调用A类的默认构造函数来初始化B类中A类的值。
class A
{
A();
int x;
}
A::A()
{
//initialized x
x=10;
}
class B
{
B();
A aobj;
}
B::B()
{
//Calling class A's default constructor to initialize B's aobj.
aobj();
}
我收到了对#(; aobj)'的不匹配电话。请帮我解决。
答案 0 :(得分:3)
实际上,除非您明确构造成员,否则您不需要显式默认构造成员。如果您想要显式构造成员,无论是默认构造还是其他构件,您需要将初始化放入成员初始化列表中:
B::B()
: aobj() {
}
函数体中的表达式aobj()
尝试在成员aobj
上使用函数调用运算符。这样做可能是合理的,例如,当aobj
属于std::function<void()>
类型时。
答案 1 :(得分:2)
在语句的上下文中,aobj()
不会尝试构造aobj
变量,而是尝试使用operator()
运算符重载来调用它。
相反,尝试在B::B()
的初始化列表中进行构造:
B::B() : aobj()
{
}
但请注意,这是多余的,因为如果从初始化列表中省略,将隐式调用成员对象的默认构造函数。也就是说,这个构造函数会做同样的事情:
B::B() { }