我有一个有趣的问题。考虑这个类层次结构:

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/

10-13 09:41