【问题标题】:Efficiently adding large group of classes to a map array in C++有效地将大量类添加到 C++ 中的映射数组
【发布时间】:2017-02-20 17:55:06
【问题描述】:

所以我有大量的类(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();

但是,使用这种方法,我仍然需要在同一个函数或其他东西中多次调用它。

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

【问题讨论】:

  • 大概这些类都派生自一个通用的基类?
  • 是的,他们都是。

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


【解决方案1】:

使用

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

不是一个好主意(即使您修复了尝试使用单引号定义字符串的错误语法)。它打破了Open/Closed Principle。如果你想在你的系统中添加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. 使用在 .cpp 文件中定义的名为 Initializer 的帮助程序类。
  2. 在`Initializer 的构造函数中调用App::registerObject
  3. 在 .cpp 文件中创建范围为 staticInitializer 实例的文件

类名1.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());
}

【讨论】:

  • 是的,这与我的计划相似。我知道我不应该公开对象数组,也没有计划这样做。无论如何,我不能在全局空间中调用 registerObject ,可以吗?我的意思是我必须在函数中调用它,对吗?
  • 正确。我在名为Initializer 的.cpp 文件中使用了一个帮助程序类。在类的构造函数中,我进行了这样的调用,并确保在 .cpp 文件中构造了一个 Initializer 类型的 static 对象。
  • 您能否更新您的答案,详细说明帮助程序类和初始化程序?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
  • 1970-01-01
  • 2017-08-21
  • 1970-01-01
  • 2020-08-11
  • 1970-01-01
相关资源
最近更新 更多