【问题标题】:Having trouble with inheritance in implementation of C++ factory method在实现 C++ 工厂方法时遇到继承问题
【发布时间】:2019-04-27 00:02:21
【问题描述】:

对设计模式相当陌生,也许我已经错过了已回答的问题。由于继承问题,我无法练习工厂设计模式。

这是基类

 #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();

我一直在寻找其他继承问题,但找不到解决我正在查看的问题的问题。

感谢您的帮助,如果是转载,请见谅

【问题讨论】:

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


【解决方案1】:

有几点需要考虑:

  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"; }
};

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    相关资源
    最近更新 更多