OOP GUI,模板C ++

时间:2017-01-02 21:34:11

标签: c++ oop

我是一名游戏设计师,他来自类似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()

有人可以帮助我吗?非常感谢提前!

1 个答案:

答案 0 :(得分:1)

应在类定义之外定义所有静态字段。在您的情况下,您必须在类定义后添加这些代码行:

template<class GUI_ELEMENT>
list<GUI_ELEMENT> gui<GUI_ELEMENT>::el_stack;