Почему я получил ошибку "ошибка C2259: ... не удалось создать экземпляр абстрактного класса"? - PullRequest
0 голосов
/ 14 февраля 2011

Любая помощь ценится.Я работаю над шаблоном фабрики C ++ и получаю эту ошибку.

1> c: \ users \ brian \ documents \ visual studio 2010 \ projects \ cst276lab_3 \ guitar.hpp (456): ошибка C2259:'ElectricGuitarComponentFactory': не может создать экземпляр абстрактного класса

Это мой код:

///////////////////////guitar class////////////////////

class Guitar

{

      private: std::string _name;

      protected: mutable std::auto_ptr< HeadStock > _HeadStock;
      protected: mutable std::auto_ptr< NeckStrap > _NeckStrap;
      protected: mutable std::vector< Bridge* > _Bridge;
      protected: mutable std::auto_ptr< Strings > _Strings;
      protected: mutable std::auto_ptr< Switches > _Switches;
      protected: mutable std::auto_ptr< GuitarBody > _GuitarBody;

      public: virtual void prepare() const = 0;

      private: Guitar( const Guitar& ); // Disable copy constructor
      private: void operator=( const Guitar& ); // Disable assignment operator

      protected: Guitar()
      {
      }
      public: virtual ~Guitar()
      {

         for( std::vector< Bridge* >::iterator iterator = _Bridge.begin();
         _Bridge.end() != iterator; ++iterator )
         {
            delete *iterator;
         }
         _Bridge.clear();

      }
      public: virtual void bake() const 
      {
         std::cout << "Bake for 25 minutes at 350" << std::endl;
      }
      public: virtual void cut() const 
      {
         std::cout << "Cutting the pizza into diagonal slices" << std::endl;
      }
      public: virtual void box() const
      {
         std::cout << "Place pizza in official PizzaStore box" << std::endl;
      }
      public: void setName( std::string name) 
      {
         _name = name;
      }
      public: std::string getName() const 
      {
         return _name;
      }
      public: std::string toString() const 
      {
    std::stringstream value; 
    value << "---- " << _name.c_str() << " ----" << std::endl;
    if( _HeadStock.get() != 0 ) 
    {
       value << _HeadStock->toString();
       value << std::endl;
         }
    if( _NeckStrap.get() != 0 ) 
    {
       value << _NeckStrap->toString();
       value << std::endl;
    }
    if( _Strings.get() != 0 ) 
    {
       value << _Strings->toString();
       value << std::endl;
    }
    if( _GuitarBody.get() != 0 )
    {
       value << _GuitarBody->toString();
       value << std::endl;
    }

    if( _Switches.get() != 0 )
    {
       value << _Switches->toString();
       value << std::endl;
    }

    if( _Bridge.size() != 0 )
    {
       for( std::vector< Bridge* >::iterator iterator = _Bridge.begin(); 
            _Bridge.end  () != iterator; ++iterator ) 
       {
          value << ( *iterator )->toString() << ", ";
       }
       value << std::endl;
    }

    return value.str();
      }
};


//////////////////////////////////////Class guitar store////////////////


class GuitarStore 

{

      protected: GuitarStore() 
      {
      }
      public: virtual ~GuitarStore() = 0 
      {
      }
      public: std::auto_ptr< Guitar > orderGuitar( std::string type ) const 
      {
         std::auto_ptr< Guitar > guitar( createGuitar( type ) );
         std::cout << "--- Making a " << guitar->getName() << " ---" << std::endl;
         guitar->prepare();
         guitar->bake();
         guitar->cut();
         guitar->box();
         return guitar;
      }
      public: virtual std::auto_ptr< Guitar > createGuitar( std::string type ) const = 0;
};


//////////////////////////////////guitar component factory////////////////////////////////



class GuitarComponentFactory 

      {
         public: virtual HeadStock* createHeadStock() const = 0;
         public: virtual NeckStrap* createNeckStrap() const = 0;
         public: virtual Strings* createStrings() const = 0;
         public: virtual std::vector< Bridge* > createBridge() const = 0;
         public: virtual Switches* createSwitches() const = 0;
         public: virtual GuitarBody* createGuitarBody() const = 0;
         public: virtual ~GuitarComponentFactory() = 0 {}
      };


///////////////////////////// electric guitar///////////////////

class ElectricGuitar : public Guitar

{

      private: mutable std::auto_ptr< GuitarComponentFactory > _ingredientFactory;

      public: explicit ElectricGuitar( GuitarComponentFactory* ingredientFactory ) :
      _ingredientFactory( ingredientFactory ) 
      {
         assert( ingredientFactory );
      }
      public: void prepare() const 
      {
         std::cout << "Preparing " << getName().c_str() << std::endl;
         _HeadStock = std::auto_ptr< HeadStock>( _ingredientFactory->createHeadStock() );
         _NeckStrap = std::auto_ptr< NeckStrap>( _ingredientFactory->createNeckStrap() );
         _Strings = std::auto_ptr< Strings>( _ingredientFactory->createStrings() );
         _Switches= std::auto_ptr< Switches>( _ingredientFactory->createSwitches() );
         if( _Bridge.empty() ) 
            _Bridge = _ingredientFactory->createBridge();
      }
};


//////////// electric guitar component factory////////////////


class ElectricGuitarComponentFactory : public GuitarComponentFactory 

{

      public: HeadStock* createHeadStock() const 
      {
         return new AngledHeadStock();
      }
      public: NeckStrap* createNeckStrap() const 
      {
         return new LeatherNeckStrap();
      }
      public: Strings* createStrings() const 
      {
         return new NylonStrings();
      }
      public: std::vector< Bridge* > createBridge() const 
      {
         std::vector< Bridge* > bridge;
         bridge.push_back( new ChromeBridge() );
         return bridge;
      }

      public: Switches* createSwithes() const
      {
         return new SPDT_Switches();
      }

      public: GuitarBody* createGuitarBody() const 
      {
         return new HollowGuitarBody();
      }

};


//////////////////// electric guitar srore  ////////////////


class ElectricGuitarStore : public GuitarStore 

{

      public: std::auto_ptr< Guitar > createGuitar( std::string item ) const
      {
         std::auto_ptr< Guitar > guitar( 0 );
         GuitarComponentFactory* ingredientFactory = new ElectricGuitarComponentFactory();
         if( item.compare( "Electric" ) == 0 ) 
         {
       guitar = std::auto_ptr< Guitar >( new ElectricGuitar( ingredientFactory ) );
       guitar->setName( "Electric GuitarBody" );
            return guitar;
         }
      }
};

любая помощь будет хорошей, спасибо заранее ... =)

Ответы [ 3 ]

4 голосов
/ 14 февраля 2011

Чтобы решить конкретную проблему, вам нужно объявить деструктор для ElectricGuitarComponentFactory, потому что вы объявили деструктор базового класса как чисто виртуальную функцию. Почему вы объявили деструктор базового класса чисто виртуальным, я не знаю; это действительно не имеет никакого смысла делать это. Деструктор должен быть объявлен виртуальным, но не чисто виртуальным.

Кроме того, синтаксис, который вы использовали,

public: virtual ~GuitarComponentFactory() = 0 {}

плохо сформирован. Вы не можете объявить чисто виртуальную функцию и предоставить определение для нее в определении класса. Если вы хотите предоставить определение для чисто виртуальной функции, вы должны сделать это вне определения класса. Компилятор, который вы используете, Visual C ++, немного мягок в отношении этого правила.

2 голосов
/ 14 февраля 2011
class GuitarComponentFactory 
  {
     public: virtual ~GuitarComponentFactory() = 0 {}
  };

В вашем производном ElectricGuitarComponentFactory вы не предоставляете деструктор, поэтому это все еще абстрактный класс.

0 голосов
/ 14 февраля 2011

ElectricGuitarComponentFactory наследует GuitarComponentFactory ....

Когда вы наследуете абстрактный класс (abstract = имеет чисто виртуальные методы), вам необходимо переопределить все эти методы.

в GuitarComponentFactory у вас есть 7 методов, а в ElectricGuitarComponentFactory вы только объявили 6.

Вы забыли переопределить деструктор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...