有没有办法为两个类声明共同的朋友函数

时间:2015-06-03 15:00:34

标签: c++ circular-dependency forward-declaration friend-function

class CDB;

class CDM
{
public:
    friend CDB& CDB::Add(const CDM&);
    CDM& Add(const CDB&);
};

class CDB
{
public:
    CDB& Add(const CDM&);
    friend CDM& CDM::Add(const CDB&);
};

此代码给出了错误:错误C2027:使用未定义的类型' CDB'。如何解决这个问题。

2 个答案:

答案 0 :(得分:1)

不,你不能这样做。无法消除循环依赖。

您应该能够让课程CDB成为CDM的朋友,而不是想让CDB::Add()成为朋友。

class CDB;

class CDM
{
   public:
      friend class CDB;
      CDM& Add(const CDB&);
};

class CDB
{
   public:
      CDB& Add(const CDM&);
      friend CDM& CDM::Add(const CDB&);
};

答案 1 :(得分:0)

您可以使用文件静态函数作为中继:

class CDB;
class CDM;

static CDB& CDBAdd(CDB&, const CDM&);

class CDM
{
public:
    friend CDB& CDBAdd(CDB&, const CDM&);
    CDM& Add(const CDB&);
};

class CDB
{
public:
    CDB& Add(const CDM& other) {
        return CDBAdd(*this, other);
    }
    friend CDM& CDM::Add(const CDB&);
    friend CDB& CDBAdd(CDB&, const CDM&);
private:
    CDB& doAdd(const CDM& other); // will contain the actual implementation
};

CDB& CDBAdd(CDB& obj, const CDM& other) {
    return obj.doAdd(other);
}

// other implementations ...
相关问题