继承类的构造函数的格式

时间:2014-02-18 21:36:08

标签: c++ inheritance constructor

我在Linux系统上用c ++编程。我有一个类Queue和一个类Sim,它继承了Queue的公共成员。队列正在编译和测试。但是当我尝试为类Sim编写构造函数时,我得到一个错误。

我省略了不相关的代码。

错误:

  

〜$ make -f p04make

     

make:警告:文件`Sim04.cpp'将来的修改时间为7.2秒

     

g ++ -g -c Sim04.cpp

     

Sim04.cpp:在构造函数âSim:: Sim(int)中:

     

Sim04.cpp:28:64:错误:没有匹配函数来调用âQueue:: Queue()â

     

Sim04.cpp:28:64:注意:候选人是:   Queue04.h:27:3:注意:Queue :: Queue(int)

     

Queue04.h:27:3:注意:候选人需要1个参数,0提供

     

Queue04.h:19:7:注意:Queue :: Queue(const Queue&)

     

Queue04.h:19:7:注意:候选人需要1个参数,0提供

     

make: * [Sim04.o]错误1

在Queue.h中:

class Queue {
int* Q;
int oldest;
int newest;
int size;
int count;

public:
    Queue(int sz);

在Queue.cpp中:

Queue::Queue(int sz = 100)
        :oldest(0), newest(-1), size(sz),count(0) 
        {Q = new int[size];}

在Sim.h中:

class Sim:public Queue{
    int served;
    int totalresponse;
    int maxresponse;
    void arrival(int time);
    void departure(int time);
    void Print(ostream& o, char* t, int v, char* u);

public:
    Sim();

在Sim.cpp中:

Sim::Sim():served(0), totalresponse(0), maxresponse(0) {}

这些文件都链接到主程序文件中,我正在使用makefile进行编译。 我承认我并不完全理解这个构造函数应该如何,但我将它建模在我们一直使用的构造函数上。我是不是认为构造函数应该继承Queue的构造函数并自动将Sim构造为队列?

3 个答案:

答案 0 :(得分:1)

您必须使用Queue参数从Sim构造函数调用int构造函数。所以你必须改变:

Sim::Sim():served(0), totalresponse(0), maxresponse(0) {}

类似于:

Sim::Sim(int sz=100):Queue(sz), served(0), totalresponse(0), maxresponse(0) {}

您还需要修改Sim构造函数声明以接收Queue所需的参数。

Sim(int sz);

答案 1 :(得分:0)

您没有为Queue声明的默认构造函数。 Sim的构造函数将在构造期间自动调用Queue的构造函数。

要编译它,你需要为Queue实现一个默认构造函数(一个不带参数的构造函数),或者你需要在构造Sim期间显式调用Queue的整数构造函数(一个接受int的构造函数)。

答案 2 :(得分:0)

您可以更改Queue.cpp

Queue :: Queue(int sz = 100)to Queue :: Queue(int sz)

然后在Queue.h中

class Queue {
int* Q;
int oldest;
int newest;
int size;
int count;

public:
    Queue(int sz);

class Queue {
int* Q;
int oldest;
int newest;
int size;
int count;

public:
    Queue(int sz = 100);

它会起作用。你只是犯了错误;在标题中指定默认值而不是实现。

还有一件事:它继承了整个Queue类,你不能继承一些成员。公共意味着基类中的所有公共字段也将在派生类中公开。 Private意味着基类的所有成员在派生时都是私有的,不依赖于基类的实际范围。受保护意味着所有公共成员都将转向受保护的成员。