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()); // ... } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读