0

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

}

PS これは Android-NDK プロジェクトです。コンパイルは cygwin コンソールから実行します。

4

1 に答える 1

3

最初のエラー

交換するだけ

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

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

変数の名前の前の型に注意してくださいMotionDirection*。コンパイラに型を提供する必要があります。

2 番目のエラー

関数ブロックの外に式を入れることはできません。これを「正しく」行うには、次の 2 つの方法があります。

1.

  • 戻りinitStatics()値にします。
  • プライベート静的変数を追加します。
  • の値を代入して、新しい静的変数を初期化initStatics()します。

2.

  • ネストされたクラスを追加します。
  • initStatics()コンストラクターに呼び出しを記述します。
  • そのネストされたクラスのプライベート静的変数を追加します。
于 2012-10-13T20:00:53.537 に答える