晚安
目前我正在开发类似C ++ MVC框架的东西。它现在仅用于教育目的 - 看看我是否可以完成这样的事情并完全理解它并学习关于这个(不是那样)美容语言的新事物。
我已经为模型提供了抽象类,可以扩展为创建一个新模型。它们由Register单例注册,并按字符串名称加载加载器类。
所以,现在,以这种方式写出一个空白的新模块:
# myModel.hpp
class myModel: public cinite::core::abstract::Model {
public:
myModel(cinite::core::Loader &_loader): cinite::core::abstract::Model(_loader){};
private:
static cinite::core::registerClass<myModel> __cinite_reg;
};
# myModel.cpp
cinite::core::registerClass<myModel> myModel::__cinite_reg("myModel");
这是相当多的写作,所以我决定通过添加像
这样的宏来简化这一过程#define CINITE_MODEL_CONSTRUCT(CLASS) \
CLASS(cinite::core::Loader &_loader): cinite::core::abstract::Model(_loader){};
#define CINITE_DEFINE_REGISTRY(CLASS) \
static cinite::core::registerClass<CLASS> __cinite_reg;
#define CINITE_REGISTER(CLASS, NAME) \
cinite::core::registerClass<CLASS> CLASS::__cinite_reg(#NAME);
所以现在整个事情就是这样:
# myModel.hpp
class myModel: public cinite::core::abstract::Model {
public:
CINITE_MODEL_CONSTRUCT(myModel);
private:
CINITE_DEFINE_REGISTRY(myModel);
};
# myModel.cpp
CINITE_REGISTER(myModel, myModel);
显然,写起来会更容易(至少对我而言)。
但是仍然有构造函数的东西 - 我想知道是否有任何可能解决这个问题(因为对于每个类看起来都是完全相同的,除了类名)并使用默认的abstract :: Model构造函数?我会使用一个简单的虚拟void __init()方法,没有参数,如果有人需要在他的模型中进行任何初始化并绕过整个加载器。
所以,最后,如何使用默认的abstract :: Model构造函数及其参数来使空白模型更易于编写? 我需要将加载器传递给模型,因为它使其他一切成为可能(加载其他模型,驱动程序和其他东西)。
还有另外一个奖励问题:这看起来不错,还是有什么东西可以让它在使用中变得糟糕?
对于好奇心 - 注册表事物现在看起来像这样
# registry.hpp
namespace cinite {
namespace core {
template <typename T>
abstract::Abstract *abstractCreator(Loader &_loader) {
return new T(_loader);
}
typedef abstract::Abstract* (*abstractCreatorFunc)();
class Registry {
public:
static Registry& getInstance() {
static Registry instance;
return instance;
}
Registry(){};
Registry(Registry const&) = delete;
void operator=(Registry const&) = delete;
const static unsigned int t_abstract = 0;
const static unsigned int t_model = 1;
...
static void registerModel(std::string name, abstractCreatorFunc creator);
static abstractCreatorFunc getModelCreator(std::string name);
...
private:
std::map<std::string, abstractCreatorFunc> _models;
...
};
template<typename T>
struct registerClass {
registerClass(const std::string name) {
switch (T::__regType) {
case Registry::t_model:
Registry::registerModel(name, (abstractCreatorFunc)abstractCreator<T>);
break;
...
}
}
};
}
}
# registry.cpp
using namespace cinite::core;
void Registry::registerModel(std::string name, abstractCreatorFunc creator) {
Registry::getInstance()._models[name] = creator;
}
abstractCreatorFunc Registry::getModelCreator(std::string name) {
Registry ® = Registry::getInstance();
std::map<std::string, abstractCreatorFunc>::iterator it;
it = reg._models.find(name);
if (it == reg._models.end()) {
throw exception::registryException(exception::registryException::MODEL_NOT_REGISTERED, "Model not found in registry (" + name + ")");
}
return (abstractCreatorFunc)it->second;
}
顺便说一句:注册表解决方案来自this solution(感谢@ johannes-schaub-litb)。
答案 0 :(得分:1)
您可以使用using
关键字吗?例如,此代码编译:
#include <iostream>
class A
{
public:
A(int a) : mA(a) {}
virtual ~A() {}
virtual void print() { std::cout << mA << std::endl; }
protected:
int mA;
};
class B : public A
{
public:
using A::A; // use the constructor from A
};
int main()
{
B b(10);
b.print();
return 0;
}