通常在C++中,当类A声明与类B的友谊时,类B可以完全访问类A的私有成员。我需要做的是让B类只能访问A类的一个私人成员,而没有别的。有没有什么办法,也许在C++ 11中有新东西?单身成员而不是全班同学的朋友声明?
1
A
回答
3
不是我所知道的。如果仅允许访问单个成员非常重要,则可以将数据包装到具有完全私人成员的其他课程中(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
};
类似的东西。我没有通过编译器来检查。
但我只是想知道......当你发现自己需要这样做时,是不是在你的设计中有什么根本性的缺陷?
1
假设您首先有一个好友功能的好理由,那么我认为“相信”朋友功能不会触及除了应该触及的其他事物之外没有任何错误。
请记住,任何函数具有您的类的地址[或可以以某种方式到达地址]能够修改成员变量,如果该函数希望这样做。它可能无法以便携式,未来安全可靠的方式实现,但投射指向char *
的指针将能够修改操作系统未确定的类中的任何内容。
点约private
,protected
,public
,friend
等是为了让编译器检查,你是“遵守合同” - 但它可以通过“聪明”的程序员谁是决心这样做的覆盖。作为这个“合同”的一部分,允许类或函数触碰它的朋友中的任何东西。这就是来龙去脉。如果你不想这样做,那么你不应该宣布它是一个朋友...
相关问题
- 1. 声明前向声明的类的成员函数为朋友
- 2. 朋友声明*
- 3. 朋友班'没有成员名为''
- 4. 朋友类声明
- 5. 成员是从朋友类
- 6. 没有类声明的朋友成员函数
- 7. 是班级自动成为朋友
- 8. 简单的朋友声明C++
- 9. 单身人士引起链接错误的朋友声明
- 10. 一个明确的专业化不能成为朋友声明
- 11. SQL查找不是其他成员的朋友的成员
- 12. 朋友申报不能向前声明
- 13. C++中的朋友成员函数 - 正向声明不起作用
- 14. 全班同步的成员方法
- 15. 即使X是Y的朋友,“X不是Y的成员”?
- 16. 朋友分类中的退货声明
- 17. 图 - 显示朋友(和第一学位朋友)的朋友
- 18. 有班级但不能访问私人会员的朋友
- 19. 朋友的成员函数不能访问私有成员
- 20. 如何将封闭类的朋友声明为成员模板类?
- 21. 类的朋友函数产生错误:“no'___'成员函数声明”
- 22. 朋友声明,明确模板实例声明
- 23. 为朋友功能使用声明
- 24. 声明类模板为朋友
- 25. 朋友LinkedQueue <T>;预计声明
- 26. 朋友类声明和使用指令
- 27. Azure广告组成员身份声明
- 28. SQL表为朋友,共同朋友,朋友朋友等
- 29. 朋友之友/第二学位朋友的名单。 Facebook图形API
- 30. 面向单身朋友的Facebook AppRequest
提取(声明)说一个成员到自己的类,然后使该类为'A'和父'B'的朋友? (尽管在那时你可以编写'B'来定位所述接口类,而不需要友谊。) – millimoose 2013-02-11 22:36:00
继承可以使这发生,因为友谊不会被继承。然而,你应该尝试找到一个不依赖于友谊的解决方案,因为试图用继承来解决与朋友之间的问题最终会变得很复杂。 – ssube 2013-02-11 22:36:01
getter/setter函数足够!!!! – billz 2013-02-11 22:36:37