1

これはここでの私の最初の質問です:)私は少し問題があります..これらは私のクラスです:

class Gracz{
    char znak_gracza;
public:
    Gracz();
    Gracz(char znak){
            this->znak_gracza = znak;
        };
    friend void multiplayer();
};
class Osoba: public Gracz{
public:
    Osoba();
    Osoba(char znak){
            this->znak_gracza = znak;
        };
    friend void multiplayer();
};

関数 multiplayer もあります。ここで、引数付きのコンストラクターを使用してみます。

void multiplayer(){
    Osoba gracz1('O');
    Osoba gracz2('X');
...
}

しかし、うまくいきません。

エラーは と で同じgracz1ですgracz2

error C2248: 'Gracz::znak_gracza' : cannot access private member declared in class 'Gracz'
see declaration of 'Gracz::znak_gracza'
see declaration of 'Gracz'
4

4 に答える 4

7

派生クラスは、親クラスのプライベート メンバーにアクセスできません。それらを次のように宣言できますprotected(これはプライベートに似ていますが、派生クラスがそれにアクセスできるようにします)が、あなたの場合、Gracz変数を初期化する方法を提供するためOsoba、引数をGraczコンストラクターに渡すだけです。

Osoba(char znak)
    : Gracz(znak) // initializes parent class
{}
于 2013-05-29T13:13:53.290 に答える
5

privateメンバーアクセスは、クラスのメンバーと友達のみが利用できます。char znak_graczaとして宣言するために探しているものなprotectedので、継承するクラスもGraczそのメンバーにアクセスできます。

クラス Gracz は次のようになります。

class Gracz{
protected:
    char znak_gracza;
public:
    Gracz();
    Gracz(char znak){
            this->znak_gracza = znak;
        };
    friend void multiplayer();
};
于 2013-05-29T13:12:25.613 に答える
2

コンストラクターは、基本クラスのコンストラクターにパラメーターを渡す必要があります。

class Osoba: public Gracz{
public:
    //...
    Osoba(char znak) :
    Gracz(znak) {
    }

};

于 2013-05-29T13:14:47.477 に答える
0

multiplayer関数はクラスの友達ですがGraczOsobaクラスはそうではありません。

子クラスは、親クラスのプライベート変数に自動的にアクセスできないことに注意してください。変数Osobaにアクセスしたい場合は、それを作成する必要があります。znak_graczaprotected

于 2013-05-29T13:13:52.843 に答える