【问题标题】:c++ oop: function pointer tablec++ oop:函数指针表
【发布时间】:2013-12-05 14:59:09
【问题描述】:

我还是 OOP 和 c++ 的新手,我正在努力学习良好的习惯。

我正在重组我继承的一个 c++ 项目。我的一大抱怨是他们如何实现命令外壳解释器/解析器。它们基本上具有现有的最大 if/elseif 列表,并且每个可能的响应函数都在单个文件中处理。它在一个文件中迅速炸毁了数千行代码。这不是很有效(命令的二进制搜索会快很多),并且导航文件以添加新的命令/响应,甚至跟踪现有响应的行为是一个巨大的困难。

我想做的是两件事:

1) 将所有这数百个函数放在一个文件中,并将它们分组到几个外部文件中,按照我决定的一些高级抽象概念进行分组。

2) 有一个大表/数组,其中包含一个字符串命令和适当的函数指针响应。我会在适当的时候对它进行排序和二进制搜索。我想在一个地方初始化这个表,所以如果我需要添加一个新命令,我可以追加到表中。一表一格,将命令映射到响应

所以我想知道您的 c++/oop 专家在实现这些文件和表格的情况下会提出什么建议。就像我说的我很新,所以我想知道所有这些新的外部文件是否应该只包含静态函数和变量(只是一个“命名空间”文件),或者我是否应该让它们成为成熟的类。类概念听起来不错,但我想知道在将这些对象的方法指针用于编译时初始化表时是否会出现某种实例化排序问题。或者在这种情况下单例类是否有意义?

【问题讨论】:

  • boost (www.boost.org) 有一些很酷的东西可以帮助您使用命令行解析器。为什么不看看?
  • 另外,(假设函数具有相同的签名),std::map<std::string, funcptr> 听起来很适合#2。
  • Command Pattern 也可能会有所帮助。

标签: c++ oop pointers


【解决方案1】:

非常简单的解决方案是拥有一个通过名称注册和调用您的函数的单例类:

class FunctionRegistry {
public:
    typedef std::function< void() > Function;

    void registerFunction( const std::string &name, Function f );
    void call( const std::string &name );

    static FunctionRegistry &instance();
private:
    FunctionRegistry();
    FunctionRegistry( const FunctionRegistry & );
    ...
};

// cpp file
FunctionRegistry &FunctionRegistry::instance()
{
     static FunctionRegistry theRegistry;
     return theRegistry;
}

如果您想将某些内容传递给该函数并使用 std::bind 分配签名不完全匹配的函数,您可以修改函数签名和方法调用。在该类中,您将有一个映射或哈希映射&lt;std::string, Function&gt;。您可能需要添加诊断信息,例如何时已注册具有特定名称的函数以及何时调用未注册的函数,但详细信息。

现在你可能想要一个助手:

class FunctionRegistrator {
public:
    FunctionRegistrator( const std::string &name, FunctionRegistry::Function f )
    {
        FunctionRegistry::instance().registerFunction( name, f );
    }
};

现在您可以按照自己的意愿对函数进行分组,您需要在 cpp 文件中执行哪些操作:

namespace {
    FunctionRegistrator regfunc1( "func1", std::bind( func1 ) );
    ...
}

对于您在该 cpp 文件中的每个功能。 如果您不能使用 c++11,您可能需要使用 boost::bind 和 boost::function。

【讨论】:

    猜你喜欢
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 2012-04-03
    • 2011-08-15
    • 2020-05-17
    相关资源
    最近更新 更多