2017-12-30 32 views
1

data classへのメンバポインタを持つuser classがあります。しかし、私はuserを拡張derivedUserを実装したいが、それはまた、derivedData classに格納された追加データを持っている必要があり、それはこのようなものになります。C++ベースクラスポインタを変更する派生クラス

class Data { 
    /*...the stored data...*/ 
} 

class DerivedData : public Data { 
    /*...the additional data...*/ 
} 

class User { 

    public: 
     /*...some methods that use dp...*/ 

    protected: 
     Data* dp; 
} 


class DerivedUser : public User { 

    public: 
     /*...even more methods that use ddp...*/ 

    protected: 
     DerivedData* ddp; 
} 

しかし、ここでは問題である:道で私をDerivedUser classは、同じオブジェクトを指す異なるタイプの2つのポインタを格納することになり、最適ではありません。 DerivedUserには1つのポインタしか格納されておらず、タイプがDerivedDataであることを知っていて、間違ったタイプのデータが与えられていれば失敗します。そして、問題は、これをどのように実装するのですか?

アイブ氏は試してみました:

class DerivedUser : public User { 

    public: 
     /*...even more methods that use ddp...*/ 

    protected: 
     DerivedData* ddp = dynamic_cast<DerivedData*>(dp); 
} 
+0

AREN」それらのクラスの 'private' /' protected'フィールドを初期化するコンストラクタがありますか?ですから、なぜ適切な型の 'Data'インスタンスのみを受け入れ、フィールドの初期化に使用するコンストラクタを作ることができませんか? –

+0

派生クラスを指すのはなぜですか?仮想関数を使用し、可能であればベースを指すだけです。 – Steve

答えて

2

DerivedData* GetData() { return static_cast<DerivedData>(dp); }

あなたはDerivedUserのコンストラクタは次のように見える場合dpDerivedData*であることを確認することができますDerivedUserクラスのメソッドDerivedData* GetData()を追加します。

DerivedUser(DerivedData* d):User(d){}

ここで

完全なコードです:

class Data { 
    /*...the stored data...*/ 
} 

class DerivedData : public Data { 
    /*...the additional data...*/ 
} 

class User { 

    public: 
     User(Data* d):dp(d){} 
     /*...some methods that use dp...*/ 

    protected: 
     Data* dp; 
} 

class DerivedUser : public User { 

    public: 
     DerivedUser(DerivedData* d):User(d){} 
     /*...even more methods that use ddp...*/ 

    protected: 
     DerivedData* GetData(void) 
     { 
      return static_cast<DerivedData*>(dp); 
     }; 
} 
2

私はあなたがDerivedUserはそのコンストラクタでDerivedDataを持つようにしたいことがわかります。

多型のために、親クラスはその子クラスを参照できます。だから、これは合法である:ここでは

Data* dp = new DerivedData(); 

は、あなたが探しているソリューションです。今

class User { 

public: 
    /*...some methods that use dp...*/ 

    User(Data* dp){ 
     this->dp = dp; 
    } 

protected: 
    Data* dp; 
}; 

class DerivedUser : public User { 

public: 
    /*...even more methods that use ddp...*/ 

    DerivedUser(DerivedData *dp) : User(dp) { 

    } 
}; 

、ここにあなたのDerivedDataクラス

にDerivedUserポイント:

int main(){ 

    DerivedData* dp = new DerivedData(); 

    DerivedUser* user = new DerivedUser(dp); 


    return 0; 
} 
関連する問題