我是一名游戏设计师,他来自类似Basic的编程语言并转向C ++ 对于新游戏,我希望使用OOP编程。
我的gui目前包含一个 gui -class(外包装),一个 g_element -class(包含所有常用属性的中间包装)和一个 button -class(覆盖并扩展g_element-class)。
问题是我收到以下错误:
严重级代码描述项目文件行抑制状态 错误LNK2001未解析的外部符号" public:static class std :: list,class std :: allocator> > GUI
:: el_stack"(el_stack @ $ GUI @ V $ g_element @ Vbutton @@@@@@ 2V $列表@ V $ g_element @ Vbutton @@@@ V $分配器@ V·????? ?$ g_element @ Vbutton @@@@@ STD @@@ STD @@ A)
我真的认为这个错误并不是唯一的问题 - 我可能对这整个事情采用完全错误的方法。我也不太确定那个模板 - 我以为我以后能用gui-elements扩展我的g_element类(比如按钮,滑块,窗口......) - 但是给我如果有可以优化的东西,请提示。
这是我的gui.cpp文件(到目前为止):
using namespace std;
template <class GUI_ELEMENT> class gui {
protected:
void add_to_stack(GUI_ELEMENT elem) {
// The error comes from here..
// I wanted a list of all my g_elements (buttons)
el_stack.push_back(elem);
printf("size now: %d", el_stack.size());
}
unsigned int get_stack_size() {
return el_stack.size();
}
public:
static list<GUI_ELEMENT> el_stack; // The elements list
void render() {
// here, I'd like to iterate over all i.e. buttons to draw them
}
};
template <class GUI_ELEMENT> class g_element : public gui<g_element<GUI_ELEMENT> >{
private:
float x;
float y;
float w;
float h;
public:
void set_width(float width) {
this->w = width;
}
float get_width() {
return this->w;
}
};
class button : public g_element<button> {
protected:
char* caption;
public:
button(float x, float y, float w, float h, char* caption) {
this->set_width(w);
this->set_caption(caption);
this->add_to_stack(*this);
}
void set_caption(char* caption) {
this->caption = caption;
}
char* get_caption() {
return this->caption;
}
};
我想像我这样使用我的gui:
// Create a few test buttons
button b1(50, 50, 100, 50, "Test");
b1.set_width(150);
float s = b1.get_width();
printf("size w: %f", s);
printf("\ncaption: %s", b1.get_caption());
button b2(50, 50, 100, 50, "Test");
button b3(50, 50, 100, 50, "Test2");
button b4(50, 50, 100, 50, "Test3");
// Rendering currently (all buttons at once)
gui<button> G;
G.render();
// but this would be nicer:
gui::render_buttons()
// or
gui<button>::render()
有人可以帮助我吗?非常感谢提前!
答案 0 :(得分:1)
应在类定义之外定义所有静态字段。在您的情况下,您必须在类定义后添加这些代码行:
template<class GUI_ELEMENT>
list<GUI_ELEMENT> gui<GUI_ELEMENT>::el_stack;