<强>可能重复:结果   何时使用 '朋友' 中的C ++?

我在我的C ++刷牙(我是一个Java开发人员)和我碰到,我已经忘记了一会儿friend class关键字来了。是的,这只是在厨房水槽的一部分,这些功能这一块,还是有一个很好的理由这样做,而不仅仅是一个香草消气?我明白谁可以访问数据,它限制的不同,但我不能想象一个场景时,这将是必要的。

注:我已经看到了类似的问题,但具体我要问,这只是一个高级功能,增加了没有真正的价值除了迷惑人在看你的代码,直到他们意识到你在做什么?

有帮助吗?

解决方案

我同意说,如果使用得当的朋友关键字可以提高封装的意见。我只想补充一点,最常见的(合法的!)使用友元类可测试。你可能需要一个测试类具有比其他客户端类的访问更大程度会有。的测试器类可以有很好的理由看被故意从其他类隐藏的内部的信息。

其他提示

在我的经验中,情况下,当它是如何经常被用来打破的封装相比,朋友(或可变的,这是一个有点类似)的数据,以切实提升封装是罕见的。

这是我很少有用,但是当我用它它是在我不得不分割一类的前身是一个类到需要访问一些常用的数据/功能两个独立的类案件。

编辑回应奥特洛程序员的评论:我们对这个绝对同意。另外一个从他们分裂后friend'ing类分开的选项是让公众存取,有时会破坏封装!我认为,有些人认为友好类某种程度上打破封装,因为他们已经看到了使用不当了很多,很多人可能永远不会看到它被正确使用的代码,因为它是一个罕见的事情。我喜欢你,说明它虽然方式 - 友好是不是让你分手了你的类,以及向公众开放EVERYTHING之间的良好的中间地带。

编辑回应大卫索恩利:我同意灵活性,C ++允许你做这样的事情是设计决策,进入C ++的结果。我认为这就是它使得它更重要的是了解是什么东西一般在灵活的语言好的和坏的作风。 Java的观点是,你应该永远不会有朋友类,以便这些不提供,但作为C ++程序员这是我们作为一个社区,以确定适当的使用这些非常灵活的,但有时被误用的语言结构的责任。

编辑回应汤姆:易变不一定破坏封装,但很多我在现实生活中见过的可变关键字的用途破坏封装,因为它更经常可以看到人们破坏了封装用可变比实际查找和了解在第一位置的适当使用的可变的。

当你希望一个类(工厂)负责创建另一个类(类型)的实例。你可以让民营型的构造,从而确保只有工厂可以创建类型的对象。当你想将支票委托给一些其他的类,它可以作为一个验证器是非常有用的。 只是一个使用场景。

P.S。真正缺少C#中的 “朋友” 关键字...

一个具体的实例将是一个类工厂,在那里你想一个类只能通过另一家工厂类创建,所以你做的构造私人和工厂类的生产类的朋友。

这是有点”就像一个2" 12点3/4" A-驱动插座 - 并不十分常见,但是当你需要它,你非常高兴你有它

在常见问题的有关朋友节:这里

在常见问题解答的约朋友一节:这里

两个不同的点的视图约朋友。

我看friend结构作为应在罕见的情况下被使用的语言的特征之一,但是这并不能使它无用。有几种模式,呼吁进行friend类,其中许多人已经在这个网站在右边的是“相关”吧。 ====>

当有多个类别和/或协同工作以提供相同的或抽象的接口功能友谊被使用。最典型的例子是实现某种形式的数值类的,和所有的非成员运算符函数(*, - ,+,<<等)给出的友谊,使他们能够在数值类的私有数据工作。

这种使用情况是比较少见的,但他们确实存在,而且朋友是非常有用的。

下面是一个例子,若干,我确信,其中一个朋友类可以在不忽略用于封装的原因被合理地使用。

MyClass的从GeneralClass继承。 MyClass的已经变得很大,所以你创建助手类来封装一些MyClass的功能的。然而,助手类需要访问在GeneralClass一些保护功能正常执行它的功能,所以你做助手类的朋友MyClass的。

这是不是暴露了保护功能更好,因为他们并不需要提供给大家,但它有助于保持一个面向对象的方式组织你的代码,以保持MyClass的变得过于复杂。这是有道理的,因为虽然助手类不具体继承关系到MyClass的,但它确实有某种逻辑连接到它,具体体现在代码的,并且在设计,“朋友”。

我总是(只)使用朋友进行单元测试私有方法。唯一的其他办法,我可以想像这样做将是加载了公共接口与一大堆的测试方法,这实在是太乱,所以我更喜欢隐藏在一个单独的测试类中的测试方法。

像这样:

class cMyClassTest;

class cMyClass
{
public:
.....

private:
friend cMyClassTest;
int calc();     // tricky algorithm, test carefully

};

class cMyClassTest
{
public:
int test_calc()
{
    cMyClass test;
    ....
    int result = test.calc();

    if( result == 42 )
        return 1;
    return 0;
}
};

友元类的意思是,我们都知道那是acesss从其他类变量的值,所以它主要用于使用的值,所以我们无需其他类的值返回主函数,那么主所需类的成员函数,但它具有被一类问题是朋友对于其他类然后朋友类应该在低于类的

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top