私は、互いに独立しCContainer
ているいくつかのメンバーを持つCMemberX
クラスと、を使用する他のクラスを持っています。CMemberY
CClientA
CClientB
CContainer
#include "MemberX.h"
#include "MemberY.h"
class CContainer
{
public:
CMemberX & GetX() const { return m_x; }
CMemberY & GetY() const { return m_y; }
private:
CMemberX m_x;
CMemberY m_y;
};
前方宣言ととの動的割り当てを使用しCClient
てクラスの1つを変更するときに、すべてのクラスを再コンパイルする必要がないようにしたいと思います。CMember
m_x
m_y
最初に、メンバーにポインターを作成しました。
// Container.h
class CMemberX;
class CMemberY;
class CContainer
{
public:
CContainer();
~CContainer();
CMemberX & GetX() const { ASSERT(m_pX != NULL); return *m_pX; }
CMemberY & GetY() const { ASSERT(m_pY != NULL); return *m_pY; }
private:
CMemberX* m_pX;
CMemberY* m_pY;
};
// Container.cpp
#include "Container.h"
#include "MemberX.h"
#include "MemberY.h"
// Allocate members on heap
CContainer::CContainer() : m_pX(new CMemberX()), m_pY(new CMemberY()) {}
CContainer::~CContainer() { delete m_pX; delete m_pY; }
次に、ポインタの代わりに参照を使用することもできると思ったので、元のコードのように見えます。
// Container.h
class CMemberX;
class CMemberY;
class CContainer
{
public:
CContainer();
~CContainer();
CMemberX & GetX() const { return m_x; }
CMemberY & GetY() const { return m_y; }
private:
CMemberX & m_x;
CMemberY & m_y;
};
// Container.cpp
#include "Container.h"
#include "MemberX.h"
#include "MemberY.h"
// Allocate members on heap
CContainer::CContainer() : m_x(*new CMemberX()), m_y(*new CMemberY()) {}
CContainer::~CContainer() { delete &m_x; delete &m_y; }
ポインターメンバーについて私が気に入らないのは、ポインターが実行可能であるか、実行時にオブジェクトが置き換えられる可能性があるように見えることですが、そうではありません。NULL
参照について私が気に入らないのは、CTorとDTorのコードが少しハックに見えることです。
どちらのアプローチが望ましいですか?より良い解決策はありますか?
コピー/割り当てに関する注意:クラスのインスタンスは、CContainer
いかなる状況でも相互にコピーまたは割り当てられません。