Я получил это:

// mouse.h
class Mouse {
  private:
    struct Pos {
      static GLfloat x;
      static GLfloat y;
    };    
    static Pos last;
}

И это:

// mouse.cpp
// 1)
Mouse::Pos Mouse::last = {};
// 2)
Mouse::Pos Mouse::last = { 0.0, 0.0 };
// 3)
Mouse::last.x = 0.0f;
Mouse::last.y = 0.0f;

1), 2) и 3) - мои попытки инициализировать эту вещь. Я понимаю, что в заголовке должно быть указано, что last равно static, и что источник должен его инициализировать, но что-то было не так со всеми моими попытками. Может ли кто-нибудь подсказать мне, как правильно это сделать? Я упустил какой-то очень важный момент? Это чушь? Важно, чтобы поля были статичными. Спасибо.

0
Carlos Romero 25 Ноя 2016 в 15:13

2 ответа

Лучший ответ

Вам не нужно объявлять содержимое Pos как статическое.

// mouse.h

class Mouse {
  private:
    struct Pos {
      GLfloat x;
      GLfloat y;
    };    
    static Pos last;
}

Mouse::Pos Mouse::last = { 0.0, 0.0 };

Это должно работать тоже

7
Raistmaj 25 Ноя 2016 в 12:20

Важно, чтобы поля были статичными.

Тогда last не будет иметь никакого состояния. Он просто будет ссылаться на статические значения x и y внутри Mouse::Pos.

#include "mouse.h"

GLfloat Mouse::Pos::x = 10;
GLfloat Mouse::Pos::y = 10;

Mouse::Pos Mouse::last{};

пример wandbox


Следующие утверждения проходят:

assert(Mouse::last.x == 10);
assert(Mouse::last.y == 10);
2
Vittorio Romeo 25 Ноя 2016 в 12:18