所以我有大量的课程(我希望将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();
然而,通过这种方法,我仍然需要在同一个函数或其他内容中多次调用。
如何将所有类添加到同一个数组中,但是在同一个函数中多次调用相同的代码?这样代码就不重复了。
答案 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());
注册的一种方式:
Initializer
的帮助程序类,该类在.cpp文件中定义。App::registerObject
static
的文件范围Initializer
实例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());
}