2016-08-29 6 views
-2

抽象基本クラスの保護されたデータメンバーにアクセスする際に問題があります。保護されたデータへのアクセス - >

class A { 
    public: 
     //func_xy()=0; 
     //... 
    protected: 
     int id; 
     //... 
}; 

は、今私は、抽象基底クラスAを継承:私は次のような構造を持っていると言う

class B: public A { 
    public: 
     func_xy(); 

     //... 
    private: 
     void func_b(); 
     std::vector<A*> vec_a; 
     //... 
};  

//... 

void B::func_b() { 

    A& _a = *vec_a[0]; 
    //doesn't work, class A has no member named ‘_a‘... 
    int id1 = this->_a.id; 
    //doesn't work, expected unqualified-id before ‘(’... 
    int id2 = this->(_a.id); 
} 

I`mではなく、問題が残っている参照のポインタを使用している場合。 保護されたデータメンバーを取得する手口はありますか?

+4

は 'この置き換え - _a.id''と> _ a.id'を。 '_a'はクラス変数ではなくローカル変数であることに注意してください。 –

+0

残念なことに、マーティンが指摘したように、 – FloHe

+0

を追加してください。 – Peter

答えて

3

あなたは

int id1 = _a.id; 

int id1 = this->_a.id; 

を変更することにより、コンパイルエラーを修正したら、あなたはそれはまだ動作しませんでしょう。問題は、_aAであり、Bではないことです。 Bのメンバー関数として、Bの基底の場合は、保護されたメンバーAにのみアクセスできます。

this->idに簡単にアクセスできますが、id_aにアクセスすることはできません。

は次のものが必要です。

class B: public A { 
    public: 
     func_xy(); 

     //... 
    private: 
     void func_b(); 
     std::vector<B*> vec_b; 
     //... 
};  

//... 

void B::func_b() { 

    B& _b = *vec_b[0]; 
    int id1 = _b.id; // OK. Not only can you touch this->id, you can 
         // touch the id of *any* B. 
} 
+0

... 変更することでコンパイルエラーを修正したら、 int id1 = this-> _a.id; ~ int id1 = _a.id; まだ動作しないことがわかります。 ... うん、私はこれを知っていた。あなたのソリューションはうまくいくかもしれませんが、私の問題は、オブジェクトがタスクの背後に隠れていることをコンパイル時に明確にしていないことです。つまり、ベクトルポインタが指すオブジェクトは、2つの派生タスククラス(私のアプリケーション内)のオブジェクトです。 それでは、イドになる可能性はありません。 – FloHe

+0

両方のクラスをBから派生させることはできますか?あなたはAに読み取り専用ゲッターを与えることができますか? (あるいは必要であればセッター)。 –

+0

ああ、私は上記のコードスニペットで間違いを犯しました。更新されたバージョンについては、私の次の記事を参照してください。 – FloHe

関連する問題