在实现C ++工厂方法时遇到继承问题

时间:2019-04-27 00:02:21

标签: c++ design-patterns factory factory-pattern

这是设计模式的新手,也许我已经错过了答案。由于继承问题,我在练习工厂设计模式时遇到了麻烦。

这是基类

 #ifndef FACTORY_H
 #define FACTORY_H

 #include <iostream>
 #include "truckfactory.h"

 class factory{

     public:
         std::string typeOfCar;
         factory(){}

         virtual void identifyCar(){
             std::cout << "This car is a " + typeOfCar << std::endl;
         }

         truckfactory* createTruck(){
             return new truckfactory();}
 };
 #endif

这是基础工厂类的子类。

 #ifndef TRUCKFACTORY_H
 #define TRUCKFACTORY_H

 #include "factory.h"
 class truckfactory : public factory{

     public:
         truckfactory(){
             std::cout <<"TruckFactory made"<<std::endl;
             typeOfCar = "truck";
         }   
 };
 #endif

尝试这样实现

 #include "factory.h"

 int main(){

     factory carFactory;
     truckfactory* truck;
     truck = carFactory.createTruck();

     carFactory.identifyCar();
     truck->identifyCar();

     return 0;
 }

但是我遇到了以下问题

./truckfactory.h:5:29: error: expected class name
class truckfactory : public factory
                            ^
./truckfactory.h:11:13: error: use of undeclared identifier 'typeOfCar'
            typeOfCar = "truck";
            ^
factorytest.cpp:10:12: error: no member named 'identifyCar' in 'truckfactory'
    truck->identifyCar();

我当时正在研究其他继承问题,但找不到能解决我所要解决的问题的东西。

感谢您的帮助,如果是重新发布,则表示抱歉

1 个答案:

答案 0 :(得分:2)

有几件事要考虑:

  1. 您的代码无法编译的原因是由于其结构。您不能(或不应该)让factory.h包含truckfactory.h,然后再包含factory.h。循环依赖关系会给您带来麻烦。处理此问题的正常方法是像这样转发声明truck_factory
 #ifndef FACTORY_H
 #define FACTORY_H

 #include <iostream>

class truck_factory;

class factory{

     public:
         std::string typeOfCar;
         factory(){}

         virtual void identifyCar(){
             std::cout << "This car is a " + typeOfCar << std::endl;
         }

         truckfactory* createTruck(); //Note definition must be in c++ file
 };
 #endif
  1. 从概念上讲,您的工厂应该构建对象,而不是其他工厂。例如,您可能有一个factory类,该类知道如何制造卡车,汽车,摩托车等。为此,您需要定义一个vehicle类,然后定义一个工厂来构建正确的类基于传入的类型。类似
class Vehicle {
   public:  
       virtual std::string typeOfCar() const = 0; 
       void identifyCar() {
             std::cout << "This car is a " + typeOfCar << std::endl;
         }
};

class Factory { 
    public:
        Vehicle* create_vehicle(const std::string& type); // need to somehow specify what type you want to create.
};

class Truck : public Vehicle {
    virtual std::string typeOfCar() const { return "truck"; }
};

需要在cpp文件中定义create_vehicle函数以返回各种车辆类型。