在C ++中有效地将大组类添加到地图数组中

时间:2016-10-12 03:19:54

标签: c++ arrays visual-c++ c-preprocessor

所以我有大量的课程(我希望将20多个课程存储到地图数组中:

mapArray['ClassName'] = new ClassName();

我想过做像

这样的事情
App::setup() {
    mapArray['ClassName1'] = new ClassName1();
    mapArray['ClassName2'] = new ClassName2();
    mapArray['ClassName3'] = new ClassName3();
}

但我觉得效率低下。我在思考如何做到这一点,我正在考虑使用预处理程序指令。像这样的东西

#define DECLARE_CLASS(ClassName)
    mapArray[ClassName] = new ClassName();

然而,通过这种方法,我仍然需要在同一个函数或其他内容中多次调用。

如何将所有类添加到同一个数组中,但是在同一个函数中多次调用相同的代码?这样代码就不重复了。

1 个答案:

答案 0 :(得分:4)

使用

App::setup() {
    mapArray['ClassName1'] = new ClassName1();
    mapArray['ClassName2'] = new ClassName2();
    mapArray['ClassName3'] = new ClassName3();
}

不是一个好主意(甚至在您修复了尝试使用单引号来定义字符串的错误语法之后)。它打破了here。如果要将ClassNameN添加到系统中,则必须返回修改工作函数。

使用注册机制更好。将函数registerObject声明为:

App::registerObject(std::string const& name, BaseClass* ptr);

并将其实施为:

static std::map<std::string, BaseClass*>& getClassMap()
{
   static std::map<std::string, BaseClass*> theMap;
   return theMap;
}

App::registerObject(std::string const& name, BaseClass* ptr)
{
   getClassMap()[name] = ptr;
}

然后,在包含ClassNameN实现的源文件中,请务必调用

App::registerObject("ClassNameN", new ClassNameN());

注册的一种方式:

  1. 使用名为Initializer的帮助程序类,该类在.cpp文件中定义。
  2. 在`Initializer。
  3. 的构造函数中调用App::registerObject
  4. 在.cpp文件中创建static的文件范围Initializer实例
  5. ClassName1.cpp:

    #include "ClassName1.hpp"
    
    // You can use anonymous namespace but I prefer to use a named
    // namespace. It makes names of the typeinfo object clearer.
    
    namespace ClassName1NS
    {
       struct Initializer
       {
          Initializer();
       };
    }
    
    using namespace ClassName1NS;
    
    static Initializer initializer
    
    Initializer::Initializer()
    {
       App::registerObject("ClassName1", new ClassName1());
    }