请你查看这段代码:
#include <vector>
class A
{
public:
A(int a, int b);
};
class C :public A
{
public:
C(int a, int b):A(a,b){}
static C instances;
};
C C::instances;
int main()
{
return 1;
}
编译给出了错误:
$ c++ inheritance.cpp inheritance.cpp:16:6: error: no matching function for call to ‘C::C()’ inheritance.cpp:16:6: note: candidates are: inheritance.cpp:12:2: note: C::C(int, int) inheritance.cpp:12:2: note: candidate expects 2 arguments, 0 provided inheritance.cpp:8:7: note: C::C(const C&) inheritance.cpp:8:7: note: candidate expects 1 argument, 0 provided
我需要C继承自A,我需要A在其构造函数中包含参数。 最后,我需要声明和定义实例的静态变量,不带参数。 那么有解决方案吗?我非常重视你的评论。
另一点需要注意: 如果静态变量是容器,例如:
static std :: vector instances;
代码编译得很好。为什么呢?
编辑:
感谢所有答案,
但是,如果我将C C::instances;
修改为C C::instances(0,0);
,我将收到另一个错误:
$ c ++ inheritance.cpp
/tmp/cctw6l67.o:在函数C::C(int, int)':
inheritance.cpp:(.text._ZN1CC2Eii[_ZN1CC5Eii]+0x1b): undefined reference to
A :: A(int,int)'中
collect2:ld返回1退出状态
任何想法为什么?以及如何解决它?
感谢
答案 0 :(得分:4)
如果您定义了构造函数,编译器将不再为您生成一个默认值,您尝试使用C C::instances;
调用它。你可以通过调用可用的构造函数来绕过这个:
C C::instances(0,0);
或为C
提供默认构造函数。
用
static std::vector<C> instances;
它编译因为没有创建元素,std::vector
有一个初始化空向量的默认构造函数。但
C::instances.push_back(C());
不会编译。
答案 1 :(得分:1)
使用C C::instances;
构造一个对象,因此调用它的构造函数。
由于您提供了一个带有两个参数C(int a, int b)
的构造函数,因此不再为您自动生成默认构造函数(不需要任何构造函数)。因此,您必须使用2个参数C C::instances(0, 0)
创建实例,或者为C提供额外的默认构造函数:
C() : A(0, 0)
{
}
答案 2 :(得分:1)
关于你的第一个问题:你从
行开始收到此错误C C::instances;
尝试调用不带参数的C
构造函数(即C::C()
)。您可以通过引入C::C()
构造函数来修复此问题,该构造函数使用两个默认值调用A::A(int, int)
,或者为现有构造函数指定默认值,例如。
C::C(int a = 0, int b = 0) : A(a, b) {}
关于第二个问题:std::vector
有一个默认构造函数。
答案 3 :(得分:1)
C C::instances;
这将尝试调用默认构造函数,并且编译器将不提供构造函数。
将默认构造函数添加到class A
和class C
class A
{
public:
A(int a, int b);
A() {} // implement default constructor
};
//class C
class C :public A
{
public :
C(int a, int b):A(a,b){}
C() {} // default constructor
static C instances;
};
static std::vector instances;
这样可行,因为std::vector
有一个默认构造函数。