C++年继承单身人士

Inherited singleton in C++

本文关键字:单身 继承 C++      更新时间:2023-10-16

你能看看这段代码吗:

#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 Aclass 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有一个默认构造函数。