Почему я не могу инициировать статические члены

У меня есть класс MotionDirection со статическими членами. Исходный код класса ниже. Но я просто не могу инициализировать статические члены класса и могу понять причину. Так что проблема в MotionDirection.cppсм. комментарии к деталям об ошибках компилятора.

MotionDirection.h

#ifndef MOTION_DIRECTION
#define MOTION_DIRECTION

namespace game{
class IntPosition;

class MotionDirection {
private:
IntPosition* positionDisplacement;
float angle;
MotionDirection* returnDirection;

public:
MotionDirection( IntPosition* positionDisplacement, float angle );
void setReturnDirection ( MotionDirection* returnDirection );

IntPosition* getPositionDisplacement();
float getAngle();
MotionDirection* getReturnDirection();

static MotionDirection* NONE;
static MotionDirection* LEFT;
static MotionDirection* RIGHT;
static MotionDirection* UP;
static MotionDirection* DOWN;

static void initStatics();
};
}

#endif

MotionDirection.cpp

#include "MotionDirection.h"#include "IntPosition.h"
namespace game{
MotionDirection::NONE = new MotionDirection ( new IntPosition( 0, 0),   0.0f );
// here I get an error:
// MotionDirection.cpp:10:5: error: 'NONE' in 'class game::MotionDirection' does not name a type

MotionDirection::MotionDirection( IntPosition* positionDisplacement, float angle ) {
this->positionDisplacement = positionDisplacement;
this->angle = angle;
}

void MotionDirection::setReturnDirection ( MotionDirection* returnDirection ) {
this->returnDirection = returnDirection;
}

IntPosition* MotionDirection::getPositionDisplacement() {
return positionDisplacement;
}

float MotionDirection::getAngle() {
return angle;
}

MotionDirection* MotionDirection::getReturnDirection() {
return returnDirection;
}

void MotionDirection::initStatics () {
MotionDirection::NONE  = new MotionDirection ( new IntPosition( 0, 0),   0.0f );
MotionDirection::LEFT  = new MotionDirection ( new IntPosition(-1, 0), 180.0f );
MotionDirection::RIGHT = new MotionDirection ( new IntPosition( 1, 0),   0.0f );
MotionDirection::UP    = new MotionDirection ( new IntPosition( 0,-1),  90.0f );
MotionDirection::DOWN  = new MotionDirection ( new IntPosition( 0, 1), 270.0f );
}

MotionDirection::initStatics();
// or here I get an error:
// MotionDirection.cpp:45:35: error: expected constructor, destructor, or type conversion before ';' token

}

Постскриптум Это проект Android-NDK, я запускаю компиляцию из консоли cygwin.

0

Решение

Первая ошибка

Просто замени

MotionDirection::NONE = new MotionDirection ( new IntPosition( 0, 0),   0.0f );

с

MotionDirection* MotionDirection::NONE = new MotionDirection ( new IntPosition( 0, 0),   0.0f );

Заметка MotionDirection* введите перед именем переменной: вам нужно предоставить компилятору тип.

Вторая ошибка

Вы не можете поместить выражения из функциональных блоков. Есть два способа сделать это «правильно»:

1.

  • Делать initStatics() возвращаемое значение
  • Добавьте приватную статическую переменную.
  • Инициализируйте новую статическую переменную, присвоив значение initStatics() к этому.

2.

  • Добавить вложенный класс.
  • Написать звонок initStatics() в своем конструкторе.
  • Добавьте приватную статическую переменную этого вложенного класса.
3

Другие решения

Других решений пока нет …