-1
class B_mem { 
    public: 
    int b_var; 
}; 
class D_mem : public B_mem { 
    public: 
    int d_var; 
}; 

class B { 
    public: 
    B_mem b_member; 
}; 

class D : public B { 
    public: 
    D_mem d_member; 
}; 


int main() { 
    D derived; 
    D_mem dmem; 
    dmem.b_var = 2; 
    dmem.d_var = 3; 
    B* b_ptr = &derived; 
    std::cout << b_ptr->b_member.b_var; // Doesn't print 2 
} 

D_memを設定/更新すると、B_mem(関連する場合)が自動的に設定/更新されるようにクラスを構成する方法はありますか?上の例では、Dを作成してD_memを埋めた後、B型のポインタを使ってDにアクセスします。DからB_memまでのD_memの基本クラスのメンバーにアクセスしたいと考えています。基本クラスメンバを派生クラスメンバにリンクするC++

多態性、コピーコンストラクタ、または手動でD_memとB_memを一致させずにこれを実行できるようにする関数があるかどうかは疑問です。もちろん

+0

'dmem'と' derived.d_member'がある異なるオブジェクト

は、ここでサンプル実装です。 – drescherjm

+0

ああ、そうです!私は 'dmem'を定義した後に' derived.d_member = dmem'を追加するつもりでした。修正を加えても同じ問題が発生します。 – LexTron

答えて

2

std::cout << b_ptr->b_member.b_var; // Doesn't print 2

それはしていません。

D_mem dmem; 
dmem.b_var = 2; 
dmem.d_var = 3; 

ラインはderivedのメンバ変数を変更するには、何もしませんでした。まだ初期化されていない状態です。

あなたは使用することができます。

int main() { 
    D derived; 

    D_mem& dmem = derived.d_member; // Get a reference to an existing object 
    dmem.b_var = 2;     // Modify the referenced object 
    dmem.d_var = 3; 

    // That still doesn't change b_member. 
    // Need to update it too. 
    derived.b_member.b_var = 2; 

    B* b_ptr = &derived; 
    std::cout << b_ptr->b_member.b_var; // Doesn't print 2 
} 

または

int main() { 
    D derived; 
    D_mem dmem; 
    dmem.b_var = 2; 
    dmem.d_var = 3; 

    derived.d_member = dmem; // Set the value of derived. 
    derived.b_member = dmem; 

    B* b_ptr = &derived; 
    std::cout << b_ptr->b_member.b_var; // Doesn't print 2 
} 

日時:多型を有するものがある場合、私は疑問に思って

、コンストラクタ、または許可する設定機能をコピー手動でD_memB_memを一致させなくても、これを行うことができます。

あなたが行うことができますが、これらの詳細の世話をし、メンバ変数をプライベートにメンバ関数を提供していますがDB_memの基本的に2つのインスタンスを持っているので、それは厄介取得する場合。

オブジェクトの代わりにポインタを使用すると、コードはよりシンプルになり、保守が簡単になります。

#include <iostream> 
#include <memory> 

class B_mem { 
    public: 
     int b_var; 
     virtual ~B_mem() {} 
}; 

class D_mem : public B_mem { 
    public: 
     int d_var; 
}; 

class B { 
    protected: 
     std::shared_ptr<B_mem> b_member; 

    public: 

     B(std::shared_ptr<B_mem> member) : b_member(member){} 
     virtual ~B() {} 

     virtual B_mem& getMember() = 0; 

     virtual B_mem const& getMember() const = 0; 
}; 

class D : public B { 

    public: 

     D() : B(std::shared_ptr<B_mem>(new D_mem)){} 

     D_mem& getMember() 
     { 
     return *(std::dynamic_pointer_cast<D_mem>(b_member)); 
     } 

     D_mem const& getMember() const 
     { 
     return *(std::dynamic_pointer_cast<D_mem>(b_member)); 
     } 
}; 


int main() { 
    D derived; 

    derived.getMember().b_var = 2; 
    derived.getMember().d_var = 3; 

    B* b_ptr = &derived; 
    std::cout << b_ptr->getMember().b_var << std::endl; 
} 

出力:

2 
関連する問題