收到的C 错误

C++ error received

本文关键字:错误      更新时间:2023-10-16

我有此代码:我收到下一个错误:A :: A(int)候选人期望1个参数,0提供了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;
}

,因为A没有构造函数,该构造函数您需要使用从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];
}

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

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

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

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

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


请注意,A::A()可以由编译器自动生成,称为默认构造函数。在此处阅读更多有关它的信息