我有一个有趣的问题。考虑这个类层次结构:
class Base
{
public:
virtual float GetMember( void ) const =0;
virtual void SetMember( float p ) =0;
};
class ConcreteFoo : public Base
{
public:
ConcreteFoo( "foo specific stuff here" );
virtual float GetMember( void ) const;
virtual void SetMember( float p );
// the problem
void foo_specific_method( "arbitrary parameters" );
};
Base* DynamicFactory::NewBase( std::string drawable_name );
// it would be used like this
Base* foo = dynamic_factory.NewBase("foo");
我已经忽略了 DynamicFactory 的定义以及 Builders 是怎样的
与它注册。 Builder 对象与一个名称相关联
并将分配 Base 的具体实现。实际上
使用 shared_ptr 来处理内存的实现有点复杂
回收,但它们对我的问题并不重要。
ConcreteFoo
具有特定于类的方法。但由于具体实例在动态工厂中创建的具体类未知或
可访问,它们只能在源文件中声明。我怎样才能
向
foo_specific_method
的用户公开 Base*
?我正在添加我提出的解决方案作为答案。我已命名
以便您可以在答案中轻松引用它们。
我不只是在寻找对我的原始解决方案的意见,新的解决方案
将不胜感激。
最佳答案
然而,转换会比大多数其他解决方案更快:
在基类中添加:
void passthru( const string &concreteClassName, const string &functionname, vector<string*> args )
{
if( concreteClassName == className )
runPassThru( functionname, args );
}
private:
string className;
map<string, int> funcmap;
virtual void runPassThru( const string &functionname, vector<string*> args ) {}
在每个派生类中:
void runPassThru( const string &functionname, vector<string*> args )
{
switch( funcmap.get( functionname ))
{
case 1:
//verify args
// call function
break;
// etc..
}
}
// call in constructor
void registerFunctions()
{
funcmap.put( "functionName", id );
//etc.
}
关于c++ - 具体类特定方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/547833/