我不断收到一个错误消息,内容是“ void Engine :: start(Tank&)的原型与类'Engine'中的任何内容都不匹配”。此外,它还显示“尚未声明'Tank',所有这些都位于在Engine类中使用相同的功能“启动”。
//Engine.h
#ifndef ENGINE_H
#define ENGINE_H
using namespace std;
class Engine {
public:
Engine(int);
~Engine() {};
void setTrip(int tr);
int getTrip();
bool isStarted();
void start(Tank &inTank);
void stop();
protected:
bool started;
int trip, numCyl;
};
#endif /* ENGINE_H */
//Engine.cpp
using namespace std;
#include "Engine.h"
#include "Tank.h"
.cpp还有更多功能,但这是错误所在的函数
发生。
void Engine::start(Tank &inTank) {
if(inTank.isEmpty()) {
cout << "Engine cannot start\n";
started = false;
}
else {
cout << "Engine started\n";
started = true;
}
}
我的主要工具是用于测试这两个类。
#include "Tank.h"
#include "Engine.h"
#include <cstdlib>
using namespace std;
int main()
{
Tank t(12);
Engine e(4);
e.start(t);
e.stop();
t.refuel();
e.start(t);
e.stop();
return 0;
}
然后添加我的Tank类
#ifndef TANK_H
#define TANK_H
using namespace std;
class Tank {
public:
Tank(float);
virtual ~Tank();
void consumeFuel(float);
float getFuel();
virtual void refuel();
bool isEmpty();
int getNumTanks();
float getTankCapacity();
void setFuel(float fl);
protected:
static int numTanks;
const float tankCapacity;
float fuel;
bool empty;
};
#endif /* TANK_H */
Tank.cpp
using namespace std;
#include "Tank.h"
#include "Engine.h"
//creates tank with certain capacity taken from parameter.
Tank::Tank(float inCap) {
Tank::tankCapacity(inCap);
}
//I completed the rest of the functions with no errors... so far.lul
最佳答案
每当头中的Reference或Pointer使用类时,都需要向前声明该类,而不是包括整个.h文件。
因此,在您的情况下,您只需要在Engine.h中转发声明类Tank,并在Engine.cpp中包括Tank.h。
//Engine.h
#ifndef ENGINE_H
#define ENGINE_H
//Forward Declaration
class Tank;
using namespace std;
class Engine {
public:
Engine(int);
~Engine() {};
void setTrip(int tr);
int getTrip();
bool isStarted();
void start(Tank &inTank);
void stop();
protected:
bool started;
int trip, numCyl;
};
#endif /* ENGINE_H */