c:\users\brian\documents\visual studio 2010\projects\cst276lab_3\gu-6ren">
gpt4 book ai didi

c++ - 为什么我收到错误 "error C2259: ... cannot instantiate abstract class"?

转载 作者:太空宇宙 更新时间:2023-11-04 15:52:55 25 4
gpt4 key购买 nike

任何帮助都适用。我正在研究 C++ 工厂模式,但遇到此错误。

1>c:\users\brian\documents\visual studio 2010\projects\cst276lab_3\guitar.hpp(456): error 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;
}
}
};

任何帮助都会很好,提前谢谢...=)

最佳答案

要修复特定问题,您需要为 ElectricGuitarComponentFactory 声明一个析构函数,因为您已将基类的析构函数声明为纯虚函数。我不知道为什么要将基类析构函数声明为纯虚拟的;这样做真的没有任何意义。析构函数应声明为虚拟的,但不能声明为纯虚拟的。

还有,你用过的语法,

public: virtual ~GuitarComponentFactory() = 0 {}

格式错误。您不能声明一个纯虚函数在类定义中为其提供定义。如果要为纯虚函数提供定义,则必须在类定义之外进行。您正在使用的编译器 Visual C++ 对这条规则有点宽松。

关于c++ - 为什么我收到错误 "error C2259: ... cannot instantiate abstract class"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4989480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com