2012-10-17 40 views
2

我只是应该习惯基本的复制构造函数。没有匹配构造函数用于初始化

我假设我正确放置了拷贝构造函数。

但是,当我尝试编译,我不断收到错误“无匹配的构造函数B的初始化”

我有点困惑。

class A { 
    int valuea; 

public:  
    A(const A&); // copy constructor 
    int getValuea() const { return valuea; } 
    void setValuea(int x) { valuea = x; } 
}; 

class B : public A { 
    int valueb; 
public: 
    B(int valueb); 
    B(const B&); // copy constructor 
    int getValueb() const { return valueb; } 
    void setValueb(int x) { valueb = x; } 
}; 

int main() { 
    B b1; 
    b1.setValuea(5); 
    b1.setValueb(10); 
    B b2(b1); 
    cout << "b2.valuea=" << b2.getValuea() << "b2.valueb=" << b2.getValueb() << endl; 

    return 0; 
} 
+2

对于A或B,没有默认构造函数 - 只要声明构造函数 - 编译器将不会生成默认构造函数。 –

+0

如果给'valueb'参数一个默认值,'B(int)'构造函数可以作为'B'的默认构造函数,从而允许'B b1;'语句工作。然而,'A'没有构造函数可以调用'B'构造函数,所以'B'依然不能被构造。 –

回答

4

通过声明B(int)B(const B &),您已禁用一个被隐置于类时,你有没有其他的构造函数,因为所有的编译器知道,你可能不希望一个默认的构造函数的默认构造函数,所以它不能作出假设(see here)。

添加以下B,记住要初始化基和成员与它:

B(){} 

在C++ 11,这个效果很好:

B() = default; 

这将使B有声明时使用的默认构造函数B b1;

A也是一样。你有一个拷贝构造函数,所以不再有默认的构造函数为你隐式地放置。

相关问题