gpt4 book ai didi

c++ - 静态成员初始化链接错误

转载 作者:太空宇宙 更新时间:2023-11-04 12:02:22 25 4
gpt4 key购买 nike

对于即将到来的类(class)作业,我正在尝试避免使用虚拟机,以查看是否可以提高性能/内存效率。当我想实现一个 StateManager(类(class)作业原型(prototype)是一个小游戏)时,问题就出现了。

为了实现这一点,我有一个模板来“统计”当前状态的成员函数调用。

一个示例状态是这样的:

struct TestState {
bool update(float delta) {
return true;
}
};

现在状态管理器应该能够获取任何状态类并绑定(bind)更新函数。使用 boost::bind 和 boost::function 很容易实现这一点,但与虚拟相比性能有所下降,所以我想看看是否可以不使用 boost。

理论上,如果 State 是一个仅包含静态函数的类/结构,这将很容易,但这也会增加不灵 active ,甚至会增加静态初始化的困惑。

StateManager 当前版本是这样的:

 class StateManager
{
public:
template <typename S> static void set(S* state)
{
#define UPDATE_ID 0

StateFunctionHandler<UPDATE_ID, S, bool, float>::bind(std::mem_fun1(&S::update), state);
m_funcUpdate = StateFunctionHandler<UPDATE_ID, S, bool, float>::exec;
}
static bool update(float delta)
{
return m_funcUpdate(delta);
}
typedef bool (*funcUpdate)(float);
private:
static funcUpdate m_funcUpdate;
};

StateFunctionHandler 是负责将成员函数包装在 StateFunctionHandler 的静态成员中的模板。模板的第一个参数是一个 ID,用于为具有相同返回类型和参数的函数强制使用多个模板。

在代码中它看起来像这样:

template <int ID, typename S, typename R, typename A>
struct StateFunctionHandler
{
static void bind(std::mem_fun1_t<R, S, A> f, S* s)
{
func = f;
pState = s;
}
static R exec(A arg)
{
return func(pState, arg);
}

static std::mem_fun1_t<R, S, A> func;
static S* pState;
};

现在的问题是为用例初始化 StateFunctionHandler 的模板化静态成员,因为我们需要强制编译器初始化它们。

在这些类的关联 cpp 文件中,静态成员被初始化:

template <int ID, typename S, typename R, typename A> std::mem_fun1_t<R, S, A> StateFunctionHandler<ID, S, R, A>::func;
template <int ID, typename S, typename R, typename A> S* StateFunctionHandler<ID, S, R, A>::pState = NULL;

StateManager::funcUpdate StateManager::m_funcUpdate = NULL;

但我收到 StateFunctionHandler::func 和::pState 的链接错误 (LNK2001),因此编译器似乎没有初始化 StateFunctionHandler 的静态成员。

用例:

 TestState* t = new TestState();
StateManager::set(t);
StateManager::update(0.1f);

再次说明一下,我不想使用 boost,这是一个实验,看看我是否可以在这个用例中避免虚函数并获得同样的性能。

最佳答案

您应该将静态模板类成员的初始化移动到头文件中。

它应该在实例化模板的每个翻译单元中可见,与非静态模板类成员一样。

关于c++ - 静态成员初始化链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13606401/

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