相关疑难解决方法(0)

什么时候应该在C++中使用'friend'?

我一直在阅读C++常见问题,并对该friend声明感到好奇.我个人从未使用它,但我有兴趣探索这种语言.

什么是使用的好例子friend


阅读常见问题更长一点我喜欢<< >>运算符重载的想法,并添加为这些类的朋友.但是我不确定这是如何不破坏封装的.这些例外何时可以保持在OOP的严格范围内?

c++ oop encapsulation friend

343
推荐指数
11
解决办法
16万
查看次数

声明前向声明的类的成员函数作为朋友

是否可以将前向声明的类的成员函数声明为朋友?我正在尝试执行以下操作:

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(); 
};
Run Code Online (Sandbox Code Playgroud)

因此,目标是(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();
};
Run Code Online (Sandbox Code Playgroud)

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

c++ friend forward-declaration

13
推荐指数
2
解决办法
5617
查看次数

标签 统计

c++ ×2

friend ×2

encapsulation ×1

forward-declaration ×1

oop ×1