C++年继承单身人士
Inherited singleton in C++
你能看看这段代码吗:
#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++ 继承.cpp继承.cpp:16:6:错误:调用"C::C()"没有匹配函数继承.cpp:16:6:注意:候选人是:继承.cpp:12:2: 注意: C::C(int, int)继承.cpp:12:2:注意:候选人需要 2 个参数,提供 0 个参数继承.cpp:8:7: 注意: C::C(常量 C&)继承.cpp:8:7:注意:候选人期望 1 个参数,提供 0 个参数
我需要 C 从 A 继承,我需要 A 在其构造函数中包含参数。最后,我需要在没有参数的情况下声明和定义实例的静态变量。那么有解决方案吗?我重视你的友好评论。
另一点需要注意:如果静态变量是一个容器,例如:
静态标准::向量实例;
代码可以很好地编译。为什么?
编辑:
感谢您的所有答案,但是,如果我将C C::instances;
修改为C C::instances(0,0);
,我会得到另一个错误:$ C++ 继承.cpp/tmp/cctw6l67.o: 在函数C::C(int, int)':
inheritance.cpp:(.text._ZN1CC2Eii[_ZN1CC5Eii]+0x1b): undefined reference to
A::A(int, int)'收集2:LD 返回 1 个退出状态
知道为什么吗?以及如何解决它?
谢谢
如果定义构造函数,编译器将不再为您生成默认构造函数,您尝试使用 C C::instances;
调用该构造函数。您可以通过调用可用的构造函数来绕过这一点:
C C::instances(0,0);
或为 C
提供默认构造函数。
跟
static std::vector<C> instances;
它编译是因为没有创建任何元素,并且std::vector
有一个初始化空向量的默认构造函数。但
C::instances.push_back(C());
不会编译。
使用 C C::instances;
您正在构造一个对象,因此调用其构造函数。
由于您C(int a, int b)
为构造函数提供了两个参数,因此不会再自动生成默认构造函数(不需要任何参数)。因此,您必须创建具有 2 个参数C C::instances(0, 0)
的 instaces,或者为 C 提供额外的默认构造函数:
C() : A(0, 0)
{
}
关于您的第一个问题:您收到此错误,因为该行
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
有一个默认构造函数。
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
有一个默认构造函数。
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 公共与私人继承
- 如何创建从同一类继承的不同对象的向量
- 如何从另一个文件继承私有成员变量和公共函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 带有继承的C++工厂
- 我应该避免多重实现继承吗
- C++继承更改成员
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 关于C++中具有多重继承"this"指针的说明
- 尝试使用继承和模板实现CRTP.Visual Studio正在生成编译器错误
- C++年继承单身人士