I have a class CContainer
that has some members CMemberX
, CMemberY
, which are independent of each other and other CClientA
, CClientB
classes that use 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;
};
I want to avoid having to recompile all CClient
classes when modifying one of the CMember
classes using forward declarations and dynamic allocation of m_x
and m_y
.
Initially, I made the members pointers:
// 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; }
Then I thought, that I could as well use references instead of pointers, so it looks more like the original code:
// 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; }
What I don't like about the pointer members is that it looks like the pointers could be NULL
or the objects be replaced at runtime, which is not the case.
What I don't like about the references is that the code in the CTor and DTor looks a bit hacky.
Which approach is preferable? Is there a better solution?
Note regarding copying/assigning: Instances of the CContainer
class will not under any circumstances be copied or assigned to each other.