我试图编写一个包含四个类的程序:车辆,汽车,飞机和飞行汽车。
飞行汽车继承汽车和飞机,汽车和飞机均继承自车辆。
vehicle.h
class vehicle
{
public:
vehicle();
vehicle(char*, int, char*);
virtual void setmodel(char*);
//more functions..
~vehicle();
protected:
char* model;
int speed;
char* color;
};
car.h
#include "vehicle.h"
class car:public virtual vehicle
{
public:
car();
car(char*, int, char*);
void driving(std::ostream&);
};
airplane.h
#include "vehicle.h"
class airplane:public virtual vehicle
{
public:
airplane();
airplane(char*, int, char*);
void flying(std::ostream&);
};
flyingCar.h
#include "car.h"
#include "airplane.h"
class flyingCar: public car, public airplane
{
public:
flyingCar();
flyingCar(char*, int, char*);
};
此外,每个类的源文件都包含相关的头文件(因此vehicle.cpp
包括vehicle.h
,car.cpp
包括car.h
等等。)。< / p>
主要功能包括vehicles.h
标题和ifndef..
。
当我编译时,我在car.h中重新定义了类车辆时出错,但由于我已经使用了virtual
我不明白如何解决问题。
我怀疑包括类源头文件中的类头可能不正确,因为继承头本身已包含在继承头中,但如果我不在此处包含它们,编译器将不会引用该类原型。作为尝试,我将所有内容都包含在ifndef..
中,没有任何正面结果。
答案 0 :(得分:4)
你应该使用包含警卫
#ifndef VEHICLE_H
#define VEHICLE_H
class vehicle
{
public:
vehicle();
vehicle(char*, int, char*);
virtual void setmodel(char*);
//more functions..
~vehicle();
protected:
char* model;
int speed;
char* color;
};
#endif
因为car.h
和airplane.h
都使用了#include "vehicle.h"
所以Vehicle
类会在flyingCar.h
中包含两个标题时定义两次。< / p>
一般来说,您应该在所有标题周围header guards,或equivalent such as #pragma once
等。