请考虑以下类定义:

#include <string>

class CParty
{
public:
    CParty();
    virtual ~CParty();
    int m_nId;
};

class CPartyEx : public CParty
{
public:
    CPartyEx();
    ~CPartyEx();
    std::string m_sName;
};

class CTransaction
{
public:
    CTransaction();
    virtual ~CTransaction();
    int m_nClassNo;
};

class CTransactionEx : public CTransaction
{
public:
    CTransactionEx();
    ~CTransactionEx();
    std::string m_sDesc;
};

class CObject
{
public:
    CObject();
    ~CObject();
    CParty* m_pParent;
    CTransaction* m_pTransaction;
};


在一个适当的实现中,我想创建以下类型的CObject存储对象:

// OK: Basic party with basic transaction
CObject iObject1;
iObject1.m_pParent = new CParty();
iObject1.m_pTransaction = new CTransaction();

// OK: Extended party with extended transaction
CObject iObject2;
iObject2.m_pParent = new CPartyEx();
iObject2.m_pTransaction = new CTransactionEx();


但是,当前的CObject定义不会阻止混合使用彼此不兼容的CParty和CTransaction类型:

// Not intended: Basic party with extended transaction
CObject iObject3;
iObject3.m_pParent = new CParty();
iObject3.m_pTransaction = new CTransactionEx();

// Not intended: Extended party with basic transaction
CObject iObject4;
iObject4.m_pParent = new CPartyEx();
iObject4.m_pTransaction = new CTransaction();


是否有可能对如何在CObject实例中将两个对象链接在一起进行限制?

最佳答案

您可以将决策封装在CObject构造函数中:

class CObject
{
public:
    CObject(bool extended = false);
};

CObject::CObject (bool extended)
{
    if (extended)
    {
        m_pParent = new CPartyEx();
        m_pTransaction = new CTransactionEx();
    }
    else
    {
        m_pParent = new CParty();
        m_pTransaction = new CTransaction();
    }
}

关于c++ - 如何在容器内强制执行两个独立类的父/派生关系?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30118606/

10-12 01:20