单个成员而不是整个类的友元声明
Friend declaration for single member instead of whole class?
通常在C++中,当类A与类B声明友谊时,类B可以完全访问类A的私有成员。我需要做的是允许类B只访问类A的一个私有成员,而不访问其他成员。有什么办法吗,也许是C++11中的新东西?
我不知道。如果只允许访问单个成员非常重要,那么可以将数据封装在另一个具有完全私有成员的类(C
)中,使该类成为B
的朋友,并为A
中的C
对象提供公共访问器。
类似这样的东西:
template<class T> class MatesWithB
{
friend class B;
public:
MatesWithB( T & val ) : data(val) {}
private:
T& data;
operator T&() { return data; }
operator const T&() const { return data; }
};
class A
{
// ...
MatesWithB<int> GetPrivateThingy() { return MatesWithB(thingy); }
private:
int thingy; // Shared with class B
};
类似的东西。我还没有通过编译器来检查这个。
但我只是想知道。。。当你发现自己需要这样做时,你的设计中不是有根本的缺陷吗?
假设你有充分的理由首先拥有一个friend函数,那么我认为"信任"friend函数不接触它应该接触的东西没有什么错。
请记住,如果任何函数希望修改成员变量,那么任何具有类地址[或可以以某种方式访问该地址]的函数都可以修改该成员变量。它可能无法以可移植、未来安全可靠的方式进行修改,但将指针投射到char *
将能够修改类中未被操作系统确定的任何内容。
private
、protected
、public
、friend
等的要点是允许编译器检查您是否"遵守了约定",但它可以被决心这样做的"聪明"程序员覆盖。作为"约定"的一部分,friend
类或函数可以接触它的朋友类中的任何东西。事情就是这样。如果你不想这样,那么你就不应该宣布它是朋友。。。
相关文章:
- 如何在嵌套类中正确使用友元声明?
- 类模板中文本运算符的友元声明
- 模板和隐式构造函数的类定义之外的友元声明
- 如何将友元声明用于具有约束的模板类
- 模板化友元声明在 G++ 5.4.0 下不起作用 - 编译器错误或错误代码
- 友元声明阻止外部函数访问类的私有部分
- C++:友元声明'声明一个非模板函数
- 友元声明及其表示的实体
- 嵌套类中需要前向声明的友元声明
- 多参数模板不能很好地处理友元声明
- 友元声明和显式模板实例化声明
- 为什么标准禁止部分专门化的友元声明
- is_constructible和is_destructibble不受友元声明的影响
- Pimpl习语和内部对象协作,无需友元声明
- C++中的友元声明-公共和私有之间的区别
- 单个成员而不是整个类的友元声明
- 关于 C++ 中友元声明的基本内容错误
- 有没有办法避免模板友元声明的外部可见性
- 如何解决c++中友元声明的循环依赖
- 指定默认实参的友元声明必须是定义