我在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构造为队列?
答案 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意味着基类的所有成员在派生时都是私有的,不依赖于基类的实际范围。受保护意味着所有公共成员都将转向受保护的成员。