【问题标题】:Is there any way to declare mutual friend functions for two classes有没有办法为两个类声明共同的朋友函数
【发布时间】:2015-06-03 15:00:33
【问题描述】:
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”。如何解决这个问题。

【问题讨论】:

  • 你不能。你必须让一个类完全成为另一个类的朋友,或者让一个类嵌套在另一个类中。
  • 您需要实例化朋友类的对象才能建立链接。例如在 CDM 中,调用 CDB::Add 对什么对象进行操作?如果函数是静态的,你也许可以摆脱它。

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


【解决方案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&);
};

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-02
      • 1970-01-01
      • 2018-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多