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在任何情况下,不会将类的实例复制或分配给对方.