Возникли проблемы с наследованием в реализации метода фабрики C ++ - PullRequest
1 голос
/ 27 апреля 2019

Довольно новый дизайн шаблонов, возможно, я уже пропустил ответ на вопрос.У меня проблемы с применением шаблона проектирования фабрики из-за проблемы наследования.

Это базовый класс

 #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 Ответ

2 голосов
/ 27 апреля 2019

Есть несколько вещей, которые следует учитывать:

  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
Концептуально ваш завод должен строить объекты, а не другие заводы.Например, у вас может быть класс 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 для возврата различных типов транспортных средств.

...