0

私はクラスを持っていprivateますint. 何らかの理由で、メソッド (コンストラクターなど) で値を変更すると、問題なく変更されます。しかし、別の方法でそれを変更し、printfその内容をさらに別の方法で出力するために使用すると、値は引き継がれず、非常に大きな数に変更されます。

ヘッダ:

class Fruit {
   private:
      int m_fruitState; // 0 = IDLE, 1 = GROWING, 2 = READY, 3 = FALLEN, 4 = ROTTEN
      int m_fruitTimer;

    public:
       Fruit ( );

       int getFruitState( ); // Returns m_fruitState
       void setFruitState( int fState );

       void growFruit( CCTime dt ); // Called every 1 second (CCTime is a cocos2d-x class)
    };

CPP

#include "Fruit.h"

Fruit::Fruit( ) {
   // Set other member variables
   this -> setFruitState( 0 );  // m_fruitState = 0
   this -> m_fruitTimer = 0;
   this -> m_fruitSprite -> schedule( schedule_selector( Fruit::growFruit ), 1.0 ); // m_fruitSprite is a CCSprite (a cocos2d-x class). This basically calls growFruit() every 1 second
}

int getFruitState( ) {
   return this -> m_fruitState;
}

void setFruitState( int state ) {
   this -> m_fruitState = state;
}

void growFruit( CCTime dt ) {
   this -> m_fruitTimer++;
   printf( "%d seconds have elapsed.", m_fruitTimer );
   printf( "STATE = %d", this -> m_fruitState ); // Says my m_fruitState is a very big number

   // This if condition never becomes true, because at this point, m_fruitState = a very big number
   if ( this -> getfruitState( ) == 0 ) { // I even changed this to m_fruitState == 0, still the same
      if ( this -> m_fruitTimer == 5 ) { // check if 5 seconds have elapsed
         this -> setFruitState( 1 );
         this -> m_fruitTimer = 0;
      }
   }
}

そしてメインで、MyClass のインスタンスを作成します。

なぜそれが起こるのか分かりません。C++ がそれを行うのはなぜですか? どうすれば修正できますか? 前もって感謝します。

4

2 に答える 2

3

への「セレクター」引数は、であるschedule必要があります。SEL_SCHEDULE

typedef void(CCObject::* SEL_SCHEDULE)(float)

つまり、 a のメンバー関数である必要がありますCCObject
また、呼び出すオブジェクトのメンバーである必要があります。そうしないと、呼び出さschedule たときのターゲットが間違ってしまいます。

私はこれを疑う

this -> m_fruitSprite -> schedule( schedule_selector( Fruit::growFruit ), 1.0 );

フルーツではなくスプライトFruit::growFruitthis指して を呼び出すと、あらゆる種類の不快感が生じます。 (は C スタイルのキャストを行うことに注意してください。つまり、本質的に安全ではありません。使用しないでください。)
schedule_selector

于 2012-08-06T09:50:55.440 に答える
3
     changeInt( int newInt );       // Assume newInt = 5

int上記の行から を削除します。

  void doSomething( ); {

;上記の行から を削除します。

更新:;ヘッダー ファイルの最後にa がありません。明らかなバグをすべて修正すると (コンパイルさえできなくなる可能性があります)、私にとっては問題なく動作します。貼り付けたコードと実際のコードにまだ違いがあるか、コンパイラのバグが見つかった可能性があります。

Constructor: myInt = 0
changeInt( int ) : myInt = 5
After constructor and calling changeInt(), myInt = 5
于 2012-08-06T08:11:25.837 に答える