1

このクラスには、そのプロパティEnemyNinja継承する名前が付けられています。の攻撃関数で、の関数Ninjaを呼び出そうとしていますが、どうすれば取得できますか。電話をかけてみましたが、つながりませんでした。NinjagetAttackPowerthis.getAttackPower

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

class Enemy {
    int attackPower;
    public:
        virtual void attack() { cout << "I am attacking you!"; }
    protected:
        int getAttackPower() {
            return attackPower;
        }
        void setAttackPower( int a ) {
            attackPower = a;
        }
};

class Ninja : public Enemy {
    void attack() {
        cout << "(minus " << getAttackPower() << " points).";
        // .................. right here ......
    }
};

int main() {
    Ninja ninjaObj;

    ninjaObj.setAttackPower(23);

    ninjaObj.getAttackPower();

}

ここに私が得ているエラーがあります:

void Enemy::setAttackPower(int) is protected
error: within this context
error: 'int Enemy::getAttackPower()' is protected
error: within this context
4

1 に答える 1

3

あなたの問題はありmainませんattack。とのアクセス修飾子を に設定Enemy::setAttackPower(int)Enemy::getAttackPower()ますprotected。つまり、これらのメソッドは、 Enemyprivateを拡張するクラス内にいる場合を除き、次のように扱われます。

つまり、オブジェクトのスコープ外であるため、その中にいるときmainはアクセスできません。ninjaObj.setAttackPower(23)main

ただし、を呼び出すとninjaObj.attack()、 のアクセス修飾子を設定していないため失敗するためNinja::attack()デフォルトで privateになります。

public:修正するには:の前に追加し、またはをNinja::attack()呼び出さないでください。Enemy::setAttackPower(int)Enemy::getAttackPower()main

于 2012-07-16T16:20:41.367 に答える