2

Как такое понимать, и как решить?

class engine
{
public:
    static engine* get_engine(window** window);
    graphics* get_graphics();
    void draw_rectangle(D2D1_RECT_F** rectangle, ID2D1Brush** brush, bool fill = false, float stroke = 1) const;
    void draw_ellipse();
    void draw_text(std::wstring text);
    void resize(RECT rect);
    void release();
    void run();
private:
    explicit engine(window** wnd);
    ~engine();
    static engine* instance_;
    graphics* gfx_;
    window** window_;
};
engine* engine::get_engine(window** window)
{
    if (!instance_)
    {
        instance_ = new engine(window);
    }

    return instance_;
}
1>engine.obj : error LNK2001: неразрешенный внешний символ ""private: static class base::controls::engine * base::controls::engine::instance_" (?instance_@engine@controls@base@@0PEAV123@EA)"
1>C:\Users\YieR\source\repos\proj\awgui\x64\Debug\awgui.exe : fatal error LNK1120: неразрешенных внешних элементов: 1
  • У Вас проблема не в ссылке на себя, а в том, что Вы не определяете статическую переменную. Почитайте про то как это делается, информации море. – ixSci Nov 24 '17 at 10:24

2 Answers2

2

Стандартная ошибка, вернее, недоделка - кроме объявления

static engine* instance_;

нужно отдельно определение в .cpp-файле:

engine* engine::instance_;
Harry
  • 221,325
  • А то что экземпляр находится в классе, это никак не создаст утечку памяти при удалении объекта? –  Nov 24 '17 at 10:30
  • 1
    В классе вы его только объявляете. И именно в классе. Он один на все объекты. Статический член создается в начале программы, уничтожается в конце. Если он у вас указатель - автоматического освобождения памяти не будет, но оно и не требуется в конце работы программы. – Harry Nov 24 '17 at 10:32
  • Хм, как я понимаю при таком раскладе в классе тогда вообще не обязательно объявлять данный указатель? –  Nov 24 '17 at 10:37
  • Можно и как внешний. Тут как вам удобнее, и чего именно вы хотите. Например, в классе он может быть закрытым, а как это сделать вне класса? – Harry Nov 24 '17 at 10:41
  • Например, в классе он может быть закрытым, а как это сделать вне класса? Понятно, спасибо! –  Nov 24 '17 at 10:42
1

Вы объявили статическое поле, но не определили его.
Определите его следующим образом

engine* engine::instance_ = nullptr

либо после определения класса в h файле, а лучше вынесите в cpp файл класса, где вы определяете методы класса