1

こんにちは、私は論理的な問題を抱えています...私は迷宮のためにちょっとしたことをしなければなりませんでしたが、それはうまくいきましたが、クラスでそれをやろうとしています.

メインの外側に void playeraction(); という関数があります。

cout<<"\nAction : ";
cin>>action;

int prevX=posX;
int prevY=posY;
unsigned char space = {32};

switch (action)
{
    case 'a':
        if(grid[posX][posY-1]!='#')
        {
            posY--;
            grid[prevX][prevY]=space;
            system("cls");
            break;
        }

このような場合、クラスを実装しようとすると、キャラクターは問題なく動きます。

    case 's':

        if(grid[posX+1][posY]!='#')
        {
            Dragon obj;
            obj.moveSouth(posX);
            grid[prevX][prevY]=space;
            system("cls");
            break;
        }

ドラゴンcppで

int Dragon::moveSouth(int posX)
{
    return posX++;
}

posX++??を返さない理由はありますか?

4

3 に答える 3

1

あなたのコードにはいくつかのバグがあります。

まず、「posX++」の場合、posX はその値を使用した後に増加します。使用する前に ++posX を使用して増加させる必要があります。

次に、関数では、その引数のメモリがスタックにあります。これらは一時的なものであり、変数の元のメモリではありません。

このコードの参照を使用できます。

void Dragon::moveSouth(int & posX){

    posX++;

}
于 2012-12-29T15:23:22.297 に答える
0

戻り値を変数に割り当てていないためです。これを試して:

int newSouth = obj.moveSouth(posX);

newSouthこれにより、新しいposX値が割り当てられます。

編集: Mats Petersson が最初のコメントで言及しているように、moveSouth 関数も変更する必要があります。

int Dragon::moveSouth(int posX){

 int newX = posX++;
 return newX;

}

ただし、新しい値を返すのではなく、元の値を増やしたい場合はposX、他の回答で Yuan が述べたように、posX への参照を使用してください。

于 2012-12-29T15:21:12.027 に答える
0

あなたの関数は、いかなる種類の内部変数または外部変数も変更しません。単にキャッチされない値を返すだけです。これにはいくつかの解決策がありますが、

  • 内部クラス変数を作成して位置を追跡し、関数を呼び出してマップ上の位置を変更するだけです。

class dragon
{
    //...
    void moveDragon(int num, int num2);
    private:
        int posX;
        int posY;
}

void dragon::moveDragon(int num, int num2)
{
    posX -= num;
    posY -= num2;
}
  • 関数が同じ値を減算して返すようにする

posX = obj.MoveSouth(posX); //new posX now holds the value
于 2012-12-29T15:27:50.933 に答える