- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
c:\users\brian\documents\visual studio 2010\projects\cst276lab_3\gu-6ren">
任何帮助都适用。我正在研究 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/
我刚遇到 MSVC(版本 12 更新 5)的问题: 如果模板函数具有通过 SFINAE 禁用的重载,则显式实例化模板函数会失败。但是,调用该函数(从而隐式实例化它)是有效的。 示例代码: #inclu
我正在阅读一本关于 DI 的书,该书总是谈论 DI 框架“实例化对象图”。为什么这样说而不是“实例化对象”? 最佳答案 对象图由保存彼此引用的对象组成。在这种情况下,图的另一个名称是网络。 如果 IO
一个类Customers实例化许多其他类(例如CustomersFromMysql、CustomersFromPostgeSQL),所有查询数据库都返回客户名称。现在,这些客户名称返回为例如 name
当我尝试调用 listenEventReducer 时,出现了这个奇怪的错误。该方法知道类型,但仍然不确定我哪里出错了。 import 'package:test/test.dart'; enum O
我正在尝试使用 org.hibernate.Interceptor.instantiate() 来拦截实例化(显然)并使用默认构造函数之外的构造函数手动实例化特定对象。如果要阅读此方法的 JavaDo
public class TestingClass { public static void main(String[] args) { int numberRooms = 6
为什么 C++ 以这样的方式创建,如果您有一个类 A 并声明一个类型 A 的数组,那么整个数组将填充使用该类的默认构造函数实例化的对象? 最佳答案 因为当您创建一个给定大小的数组时,数组的每个元素都必
考虑下面的例子 template struct S { A a; void foo() {} }; template void bar() { S *p = 0; } templat
Note that code is instantiated only for member functions that are called. For class templates, membe
当我尝试运行这段代码时: import java.io.*; import java.util.*; public class TwoColor { public static void ma
每当我尝试在 Unity 3D 中实例化粒子系统时,命令都会定位粒子但不会播放/运行动画。 这是我的代码 GameObject impactGO = Instantiate(impactEffect,
我使用以下代码在 verilog 中实例化二维内存 reg [15:0] data_pattern_even [3:0] = {16'hFFFF,16'hFFFF,16'hFFFF,16'hFFFF
假设我获得了我作为 String 创建的类的名称。 .如何使用该字符串中包含的名称实例化类?我知道它将派生自某个父类,但实际类会有所不同。 最佳答案 var instance : MyClass =
python 的 attrs 包提供了一种在实例化时验证传递的变量的简单方法 (example taken from attrs page): >>> @attr.s ... class C(obje
我收到 java 空指针异常。我无法解决它。我已在 testbase 类中初始化驱动程序,并希望在我的 Testing_TVO 类中使用相同的驱动程序 这是我的测试基类 public class te
我对 Java 编程还比较陌生,可能错过了一些明显的东西,所以请耐心等待。 我正在创建一个程序,该程序使用 Swing API 和 JDesktopPane 来创建 GUI。主屏幕上有一个按钮,上面写
python 的 attrs 包提供了一种在实例化时验证传递的变量的简单方法 (example taken from attrs page): >>> @attr.s ... class C(obje
C++ 模板中的“延迟实例化”是什么意思? 最佳答案 延迟实例化是指直到第一次使用对应的实体时才实例化模板。例如,您有一个模板化函数: template void YourFunction() {
当我阅读 spring 教程时,我发现了这样的内容: LocalChangeInterceptor localChangeInterceptor; localChangeInterceptor = n
我正在实现 unforgettable factory .一切正常,但有一件事:类(class)有时没有注册。 我认为关键部分是 Registrar::registered成员。如果使用它,“真正有趣
我是一名优秀的程序员,十分优秀!