我对C++相对较新,我正在创建一个假设的"飞行管理"应用程序作为学习体验并测试各种新技能。简单地说,我有一个FlightPlan
类,其中包含一个指向 Aircraft
类型的对象的私有成员指针(好吧,现在(。
从Aircraft
派生的对象在创建FlightPlan
时是预先存在的,我希望能够在构建FlightPlan
后(而不仅仅是在构建期间(将Aircraft
派生对象指针分配给FlightPlan
(将在计划中执行飞行的 A/C(。(使用
flight-plan-obj.AssignAircaft(cargo-aircraft-obj-pointer);
我的问题是Aircraft
是一个抽象类,CargoAircraft
和PassengerAircraft
派生,因此不知道在建造过程中将向飞行计划分配什么"类型"的空客舱。我的代码如下。(为简洁起见,省略了很多内容(
class FlightPlan {
private:
string departure;
string destination;
Aircraft* aircraft; // The a/c that will later be assigned to the flight
// Obviously this is currently wrong
public:
FlightPlan(string dep, string dest);
void AssignAircraft(Aircraft* ac);
// Other methods
}
Aircraft
抽象类:
class Aircraft {
protected:
Aircaft(string tailId, string acType); // ctor for the sub-classes
string tailId;
string acType;
public:
virtual string Overview() const =0; // pure virtual method
}
以及从Aircraft
派生的对象示例:
class CargoAircraft : public Aircraft {
private:
int cargoCapacity;
public:
CargoAircraft(string tailId, string acType, int cargoCapcity);
string Overview() const override;
}
// ctor defined in the .cpp file as:
CargoAircraft::CargoAircraft(string tailId, string acType, int cargoCapacity)
: Aircraft(tailId,acType), cargoCapacity(cargoCapacity) {};
我正在尝试做的事情可能吗?我的理解是指针多态性允许我执行以下操作:
Aircraft* aircraft; or Aircaft* aircraft = nullptr;
在FlightPlan
,后来会接受从Aircraft
派生的类的对象指针?编译时我收到:错误:"飞机"没有命名类型
我在这里的方法有什么根本性的问题吗?我是否需要放弃抽象Aircraft
而只是将其视为更多的基类,并为其提供公共默认构造函数,并使其方法只是虚拟的而不是纯虚拟的?
任何和所有的建议都将被慷慨地接受,我将感激地接受有关我使用C++的任何其他提示或技巧。谢谢。
你可以做两件事,
在 FlightPlan 中,后来会接受从飞机派生的类的对象指针?编译时我收到:错误:"飞机"没有命名类型
标题必须包含在飞机类中,以便在飞行计划之前声明。或者你可以像这样使用前向声明
class Aircraft;
告诉 Aircraft 类型的编译器它存在,并且可以声明指针,您可以在类 Flightplan 中使用。
您的问题仅与飞机类型的存在有关。使用前向声明或保证在声明飞行计划之前声明了类。
附言不要忘记Aircaft类中的虚拟破坏者