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_mem
とB_mem
を一致させなくても、これを行うことができます。
あなたが行うことができますが、これらの詳細の世話をし、メンバ変数をプライベートにメンバ関数を提供していますがD
でB_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
'dmem'と' derived.d_member'がある異なるオブジェクト
は、ここでサンプル実装です。 – drescherjm
ああ、そうです!私は 'dmem'を定義した後に' derived.d_member = dmem'を追加するつもりでした。修正を加えても同じ問題が発生します。 – LexTron