0

你能看看这段代码吗:

#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(const C&)
继承.cpp:8:7: 注意:候选人需要 1 个参数,0 提供

我需要 C 从 A 继承,我需要 A 在其构造函数中有参数。最后,我需要声明和定义不带参数的实例的静态变量。那么有没有解决办法呢?我重视你的善意评论。

还有一点需要注意:如果静态变量是一个容器,比如:

静态 std::vector 实例;

代码可以编译得很好。为什么?

编辑:

感谢所有的答案,但是,如果我修改C C::instances;C C::instances(0,0);我会得到另一个错误: $ c++ inherit.cpp /tmp/cctw6l67.o: In function C::C(int, int)': inheritance.cpp:(.text._ZN1CC2Eii[_ZN1CC5Eii]+0x1b): undefined reference toA::A(int, int)' collect2: ld returned 1 exit status

知道为什么吗?以及如何解决?

谢谢

4

4 回答 4

4

如果您定义了构造函数,编译器将不再为您生成默认构造函数,而您尝试使用C C::instances;. 您可以通过调用可用的构造函数来绕过它:

C C::instances(0,0);

或为C.

static std::vector<C> instances;

它编译是因为没有创建任何元素,并且std::vector有一个默认构造函数初始化一个空向量。但

C::instances.push_back(C());

不会编译。

于 2012-06-15T07:19:57.983 回答
1

C C::instances;你正在构造一个对象,因此调用它的构造函数。

由于您提供了带有两个参数C(int a, int b)的构造函数,因此不再为您自动生成默认构造函数(不需要)。因此,您必须使用 2 个参数创建实例,或者C C::instances(0, 0)为 C 提供额外的默认构造函数:

C() : A(0, 0)
{
}
于 2012-06-15T07:20:51.857 回答
1

关于你的第一个问题:你收到这个错误,因为这条线

C C::instances;

尝试调用C不带参数的构造函数(即C::C())。您可以通过引入使用两个默认值C::C()调用的构造函数来解决此问题A::A(int, int),或者为现有构造函数指定默认值,例如

C::C(int a = 0, int b = 0) : A(a, b) {}

关于第二个问题: astd::vector有一个默认构造函数。

于 2012-06-15T07:21:43.253 回答
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有一个默认构造函数。

于 2012-06-15T07:28:27.643 回答