动态分配成员的指针或引用始终存在?

for*_*idt 2 c++ pointers reference member

我有一个类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;
};
Run Code Online (Sandbox Code Playgroud)

我想避免在使用前向声明和动态分配和CClient修改其中一个类时重新编译所有类.CMemberm_xm_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; }
Run Code Online (Sandbox Code Playgroud)

然后我想,我也可以使用引用而不是指针,所以它看起来更像原始代码:

// 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; }
Run Code Online (Sandbox Code Playgroud)

我不喜欢指针成员是它看起来像指针可能是NULL或在运行时替换对象,但事实并非如此.

我不喜欢的参考是CTor和DTor中的代码看起来有点hacky.

哪种方法更可取?有更好的解决方案吗?

关于复制/分配的注意事项:CContainer在任何情况下,不会将类的实例复制或分配给对方.

小智 5

我认为这是const变量的用途:

CMember * const m_x;
Run Code Online (Sandbox Code Playgroud)

初始化后无法更改m_x ...