c++;oop:函数指针表 我对OOP和C++还是新的,我正在努力学习好习惯。

c++;oop:函数指针表 我对OOP和C++还是新的,我正在努力学习好习惯。,c++,oop,pointers,C++,Oop,Pointers,我正在重构一个我继承的C++项目。我最大的不满是他们如何实现命令shell解释器/解析器。它们基本上拥有现有最大的if/elseif列表,并且每个可能的响应函数都在单个文件中处理。它很快在一个文件中扩展到数千行代码。这不是很有效(对命令进行二进制搜索会快得多),而且在文件中导航以添加新命令/响应,甚至跟踪现有响应的行为都是一项艰巨的任务 我想做的是两件事: 1) 将所有这些数百个函数放在一个文件中,并将它们分组到几个外部文件中,由我决定的一些高级抽象概念进行分组 2) 有一个大的表/数组,它有一

我正在重构一个我继承的C++项目。我最大的不满是他们如何实现命令shell解释器/解析器。它们基本上拥有现有最大的if/elseif列表,并且每个可能的响应函数都在单个文件中处理。它很快在一个文件中扩展到数千行代码。这不是很有效(对命令进行二进制搜索会快得多),而且在文件中导航以添加新命令/响应,甚至跟踪现有响应的行为都是一项艰巨的任务

我想做的是两件事:

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

2) 有一个大的表/数组,它有一个字符串命令和相应的函数指针响应。我将对此进行排序,并在适当时对其进行二进制搜索。我希望在一个地方初始化这个表,这样,如果需要添加新命令,我就可以添加到表中。一点一表,将命令映射到响应


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

非常简单的解决方案是让单例类按名称注册和调用函数:

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;
}
现在,您可以按任何方式对函数进行分组,您需要在cpp文件中执行哪些操作:

namespace {
    FunctionRegistrator regfunc1( "func1", std::bind( func1 ) );
    ...
}
对于该cpp文件中的每个函数。 如果您不能使用
c++11

,您可能需要使用boost::bind和boost::function。boost(www.boost.org)有一些很酷的东西可以帮助您使用命令行解析器。为什么不看一看呢?另外,(假设函数具有相同的签名),
std::map
听起来似乎对#2有好处。它也可能有帮助。
namespace {
    FunctionRegistrator regfunc1( "func1", std::bind( func1 ) );
    ...
}