Is there any way to declare mutual friend functions for two classes

折月煮酒 提交于 2021-02-16 15:15:12

问题


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&);
};

This code gives me the error : error C2027: use of undefined type 'CDB'. How to resolve this.


回答1:


No, you can't do that. There is no way to remove the cyclic dependency.

You should be able to get by with making the class CDB a friend of CDM instead of wanting to making CDB::Add() a friend.

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&);
};



回答2:


You could use a file static function as relay :

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 ...


来源:https://stackoverflow.com/questions/30623805/is-there-any-way-to-declare-mutual-friend-functions-for-two-classes

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!