C ++中的继承单例

时间:2012-06-15 07:15:29

标签: c++ inheritance singleton

请你查看这段代码:

#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退出状态

任何想法为什么?以及如何解决它?

感谢

4 个答案:

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