gpt4 book ai didi

c++ - 自注册类(class)的替代方案

转载 作者:行者123 更新时间:2023-11-30 03:33:32 26 4
gpt4 key购买 nike

我的项目以两种方式使用自注册类:一种是实现工厂模式,允许迭代此类的映射,实现几乎与C++ how safe are self registering classes?中描述的完全相似。 ;另一个是将巨大的 switch 语句分离到对象映射中。在后一种情况下,我只创建了一个基类和一组派生类,然后我在源文件中用静态对象实例化了每个派生类,同时类的构造函数在映射中注册了它们自己。

现在我正在尝试将我的应用程序的逻辑部分移动到静态库中,并在两个子项目中使用该库(我使用 Qt、Qt Creator 和 gcc)。这样做之后,除非我在某处明确实例化此类类,否则上述类都不起作用。

所以,我正在寻找任何解决方法。实际上,另一个问题出现了:使用自注册技术在 C++ 中设计应用程序是不是一个非常糟糕的意图?

编辑:我被要求举个例子。这是简化的代码:

// Class for storing actions
class ActionBase;
class SomeObject;
class ActionMap
{
public:
ActionMap();
static void registerAction(int n, ActionBase* action) {}
void performAction (SomeObject* object, int action) {
m_actions[action]->perform(object);
}

private:
std::map<int, ActionBase*> m_actions;
};

// Action class - action.h
#include "actionmap.h"
class SomeObject;
class ActionBase
{
public:
ActionBase(int n, ActionBase* action) {ActionMap::registerAction(n, action); }
virtual ~ActionBase() = 0;
virtual void perform(SomeObject* object) = 0;
};

template<int N>
class Action : public ActionBase
{
public:
Action() : ActionBase(N, this) {}
};

template<>
class Action<1> : public ActionBase
{
public:
Action() : ActionBase(1, this) {}
void perform(SomeObject* object)
{
// Do something
}
};

现在我可以在 Action 源文件中创建一些 Action 对象,比如:

// action.cpp
// #include "action.h"
static Action<1> action1;

重组项目后,我必须在我的子项目中的某处显式创建 action1 变量才能使用它,例如在 main.cpp 中。

更新:似乎Angew帮我部分解决了第二个问题。我已经清除了一个空函数并在 action.cpp 中定义了它。在应用中的某处调用它会强制初始化操作对象。

最佳答案

was it a very bad intension to design an application in c++ using self registering techniques?

恐怕我必须对这个问题回答"is"。 C++ 明确允许在 main 启动后初始化非局部变量;唯一的限制是它们必须在执行定义它们的文件中的任何代码之前进行初始化。引用 C++14 (N4140) [basic.start.init] 3.6.3/4:

It is implementation-defined whether the dynamic initialization of a non-local variable with static storage duration is done before the first statement of main. If the initialization is deferred to some point in time after the first statement of main, it shall occur before the first odr-use (3.2) of any function or variable defined in the same translation unit as the variable to be initialized.

换句话说,在文件中定义的全局变量,其初始化进行了一些注册,可能不会被初始化(并因此注册),直到调用该文件中的其他代码。

关于c++ - 自注册类(class)的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42785951/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com