gpt4 book ai didi

c++ - 通过 operator new 定义简单对象工厂的正确语法

转载 作者:行者123 更新时间:2023-11-28 06:21:24 25 4
gpt4 key购买 nike

这是我要实现的目标的基本轮廓

class Interface {
public:
virtual ~Interface () {}
virtual void work() = 0;
static Interface *create();
static void setFactory(std::function<Interface *()>);
}

在 Interface.cpp 中我有

static std::function<Interface *()>  factory = nullptr;
Interface *Interface ::create() { return factory(); }
void Interface::setFactory(std::function<Interface *()> someFactory) {
factory = someFactory;
}

另外我有

class Implementation : public Interface {
...
}

我一定要打电话

Interface::setFactory([]() -> Interface * { return new Implementation(); });

在对 Interface::create() 进行任何调用之前。我看到的是静态工厂变量已设置(不再是 nullptr),因此对 setFactory 的调用确实有效。然而,生成的工厂是空的,调用 Interface::create() 会崩溃。我可能可以通过使用 operator() 构建结构来找到解决方法,但我想知道我的 lambda 表达式中是否有错误。

可能值得一提的是我使用的是 MSVC2013

最佳答案

您可能遇到静态初始化顺序问题。

我的理论是你的 factory 被分配到 before 被构造,然后它被构造(删除它的状态),然后你调用 create.

MSVC2015 支持神奇的静态局部变量,这主要解决了这个问题。

namespace {
std::function<Interface *()>& factory() {
static std::function<Interface *()> retval;
return retval;
}
}

现在 factory() 包装了一个静态局部变量,保证在您第一次调用函数时或之前构造,并且只构造一次。

在 MSVC2013 中做类似的事情更难。如果你知道在 main 开始调用它之前不会有多个线程,你可以执行上面的加法:

static auto&& force_call = factory();

main 开始之前强制调用。

关于c++ - 通过 operator new 定义简单对象工厂的正确语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29265223/

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