2014-10-27 371 views
0

我有2个类A和B.我试图用B类的默认构造函数来调用类A的默认构造函数来初始化类A中的值B.C++一个类的默认构造函数调用另一个类的另一个默认构造函数

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

您不是调用'A'的构造函数,而是试图调用不存在的函数调用操作符('A :: operator()()')。构造函数是未命名的特殊成员函数,不能像这样直接访问。 – 2014-10-27 15:20:45

+0

也许你应该熟悉[成员初始值列表](http://en.cppreference.com/w/cpp/language/initializer_list)。 – Sambuca 2014-10-27 15:25:34

回答

3

其实,你并不需要显式默认构造成员,除非你明确构建成员,否则会自动发生。如果你想真正构建一个成员明确,无论是默认的建设或别的东西,你需要把你的初始化到成员初始化列表:

B::B() 
    : aobj() { 
} 

在函数体的表达aobj()尝试使用成员aobj上的函数调用运算符。这样做可能是合理的,例如,当aobjstd::function<void()>类型时。

2

在声明的上下文中,aobj()不会尝试构造aobj变量,而是会尝试使用运算符重载调用它operator()

相反,尝试在做B::B()的初始化列表建设:

B::B() : aobj() 
{ 
} 

但是请注意,这是多余的,因为对于成员对象默认的构造函数,如果从初始化列表省略将被隐式调用。也就是说,这种构造会做同样的事情:

B::B() { } 
相关问题