收到C ++错误

时间:2017-09-18 09:58:13

标签: c++

我有这个代码: 我收到下一个错误:A :: A(int)候选人期望1个参数,0提供但我无法理解问题是什么。

#include <iostream>

using namespace std;
class A
{
    int x;
    public:
    A(int i):x(i) {}
    int get_x() const {return x;}
};

class B:public A
{
    int *y;
    public:
    B(int i):A(i) {y=new int[i]; for(int j=0;j<i;j++) y[j]=1;}
B(B&);
    int &operator[] (int i) {return y[i];}
};

B::B(B&a)
{
    y=new int[a.get_x()];
    for(int i=0;i<a.get_x();i++) y[i]=a[i];
}
ostream& operator<<(ostream& o, B a)
{
    for(int i=0;i<a.get_x();i++) o<<a[i];
    return o;
}
int main()
{
    B b(5);
    cout<<b;
    return 0;
}

3 个答案:

答案 0 :(得分:2)

您的第二个B构造函数B::B(B&a)使用其默认构造函数(未定义)隐式尝试构造基类A

您可以明确地调用A(int)构造函数,即:

B::B(B&a)
: A(a.get_x())
{
...

答案 1 :(得分:2)

因为A没有带0参数的构造函数,所以需要使用从A继承的任何类构造函数提供的参数显式调用构造函数,这是B案件。

在你的第一个构造函数中:

B(int i):A(i) {y=new int[i]; for(int j=0;j<i;j++) y[j]=1;}

通过致电A(i),您可以做得很好。

但是在你的第二个构造函数中:

B::B(B&a)
{
y=new int[a.get_x()];
for(int i=0;i<a.get_x();i++) y[i]=a[i];
}

没有调用A的构造函数,因此你得到一个错误,因为编译器不知道如何创建一个A对象,你可能会这样做:

B::B(B&a) : A(a.get_x())
{
y=new int[a.get_x()];
for(int i=0;i<a.get_x();i++) y[i]=a[i];
}

答案 2 :(得分:2)

问题是当您声明类型为B的对象时,您还需要构建A 的实例。 在B::B(B&a)中,您没有为A显式调用任何构造函数,因此编译器尝试调用没有参数A::A()的构造函数,但由于未声明它,因此失败。

您必须在A::A()中声明A或从A的构造函数中B明确调用其中一个可用的构造函数。

请注意,A::A()可以由编译器自动生成,并称为默认构造函数。详细了解here