2013-02-11 37 views
1

通常在C++中,当类A声明与类B的友谊时,类B可以完全访问类A的私有成员。我需要做的是让B类只能访问A类的一个私人成员,而没有别的。有没有什么办法,也许在C++ 11中有新东西?单身成员而不是全班同学的朋友声明?

+0

提取(声明)说一个成员到自己的类,然后使该类为'A'和父'B'的朋友? (尽管在那时你可以编写'B'来定位所述接口类,而不需要友谊。) – millimoose 2013-02-11 22:36:00

+0

继承可以使这发生,因为友谊不会被继承。然而,你应该尝试找到一个不依赖于友谊的解决方案,因为试图用继承来解决与朋友之间的问题最终会变得很复杂。 – ssube 2013-02-11 22:36:01

+2

getter/setter函数足够!!!! – billz 2013-02-11 22:36:37

回答

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 *的指针将能够修改操作系统未确定的类中的任何内容。

点约privateprotectedpublicfriend等是为了让编译器检查,你是“遵守合同” - 但它可以通过“聪明”的程序员谁是决心这样做的覆盖。作为这个“合同”的一部分,允许类或函数触碰它的朋友中的任何东西。这就是来龙去脉。如果你不想这样做,那么你不应该宣布它是一个朋友...