我有这个代码: 我收到下一个错误: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;
}
答案 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