1
//C++ Made Easy HD 26 - Introduction to Classes
//Michael LeCompte

#include <iostream>
#include <string>

using namespace std;


class Player {
public:
    Player() {
        cout << "1st overload" << endl;
    }

    Player(int Health){
        cout << "2nd overload" << endl;
        this->health = Health;
    }

    Player(int Health, int attPow){
        cout << "3nd overload" << endl;
        this->health = Health;
        attackPower = attPow;
    }

    ~Player() {
        cout << "Player instance destroyed" << endl;
    }

    //Mutators
    void setHealth(int val) {
        health = val;
    }

    void setAttPow(int val) {
        attackPower = val;
    }

    void setDef(int val) {
        defense = val;
    }

    void setXp(int val) {
        xp = val;
    }

    //Accessors
    int healthVal() {
        return health;
    }

    int attPowVal() {
        return attackPower;
    }

    int defVal() {
        return defense;
    }

    int xpVal() {
        return xp;
    }

private:
    int health;
    int attackPower;
    int defense;
    int xp;
};


int main() {
    Player player[4] = {Player(2, 5), Player(65, 2), Player(2), Player(1)};
    cout << player[0].healthVal() << endl;
    cout << player[1].healthVal() << endl;
    cout << player[2].healthVal() << endl;

    system("pause");
    return 0;
}

上記のコードから、私が注目している行はthis->health = Health行です。this->healthの代わりになぜ使用する必要があるのか​​ 疑問に思っていますhealth = Health。配列を使用して新しいオブジェクトを作成しているという事実と関係があることを知っていますPlayer(私はそれについてチュートリアルを行っています)。なぜそれができるのか理解できないので、使用するthis->か、どのように機能する必要があります。ありがとう。

4

6 に答える 6

6

これを使用しないでください。health = Health;動作します。しかし、適切な方法は初期化を使用することです:

Player(int Health) : health(Health) {
  // constrcutor code
}
于 2013-07-01T09:33:20.790 に答える
3
    Player(int Health){
    cout << "2nd overload" << endl;
    this->health = Health;
}

Health 名が health でキャプションが低い場合は this ポインターを使用する必要があります。そうしないと、C++ はクラス変数を使用する必要があることを認識せず、パラメーター変数を使用します。

あなたの例では、c ++はどれを使用するかを知っており(違いはキャプションにあります)、 this ポインターをスキップできます。

ただし、命名規則により、健康はより低いキャプションにする必要があります

于 2013-07-01T09:30:05.637 に答える
2

例で使用する必要はありませんthis->。オプションです。がなければthis->、コードは完全に同等になります。

于 2013-07-01T09:26:44.937 に答える
1

これは Python ではなく C++ です。名前検索では、 this->member は常にプレフィックスなしで考慮され、非表示にするローカルまたは関数パラメーターを導入した場合にのみ非表示になります。(もう 1 つの特別なケースは、基本クラスのメンバーにアクセスするためのテンプレートです。)

残念ながら、VTK のような一部のライブラリは、そのスタイルで this-> ノイズをナンセンスにしているため、癌のように広がります。

あなたの例では隠れていないので、プレフィックスを使用する理由はありません。別の注意として、ctors では、代入ではなく init リストを使用し、1-param バージョンを明示的にするのが適切なコードです。そのような場合、メンバーと同じパラメーター名を使用することもできます。

于 2013-07-01T09:32:24.970 に答える