加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 将forward声明的类的成员函数声明为friend

发布时间:2020-12-16 05:59:30 所属栏目:百科 来源:网络整理
导读:是否可以将forward-declared类的member函数声明为friend?我正在努力做以下事情: class BigComplicatedClass;class Storage { int data_;public: int data() { return data_; } // OK,but provides too broad access: friend class BigComplicatedClass; //
是否可以将forward-declared类的member函数声明为friend?我正在努力做以下事情:
class BigComplicatedClass;

class Storage {
   int data_;
public:
   int data() { return data_; }
   // OK,but provides too broad access:
   friend class BigComplicatedClass;
   // ERROR "invalid use of incomplete type":
   friend void BigComplicatedClass::ModifyStorage(); 
};

所以目标是(i)将朋友的声明限制在一个单一的方法中,(ii)不要包含复杂类的定义来减少编译时间.

一种方法可能是添加一个充当中介的类:

// In Storage.h:
class BigComplicatedClass_Helper;
class Storage {
    // (...)
    friend class BigComplicatedClass_Helper;
};

// In BigComplicatedClass.h:
class BigComplicatedClass_Helper {
     static int &AccessData(Storage &storage) { return storage.data_; }
     friend void BigComplicatedClass::ModifyStorage();
};

然而,这似乎有点笨拙…所以我认为必须有一个更好的解决方案!

解决方法

正如@Ben所说,这是不可能的,但是您可以通过 “passkey”给该成员函数提供特定的访问.它有点像中间助手类,但是更清晰:
// Storage.h
// forward declare the passkey
class StorageDataKey;

class Storage {
   int data_;
public:
   int data() { return data_; }
   // only functions that can pass the key to this function have access
   // and get the data as a reference
   int& data(StorageDataKey const&){ return data_; }
};

// BigComplicatedClass.cpp
#include "BigComplicatedClass.h"
#include "Storage.h"

// define the passkey
class StorageDataKey{
  StorageDataKey(){} // default ctor private
  StorageDataKey(const StorageDataKey&){} // copy ctor private

  // grant access to one method
  friend void BigComplicatedClass::ModifyStorage();
};

void BigComplicatedClass::ModifyStorage(){
  int& data = storage_.data(StorageDataKey());
  // ...
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读