Questions tagged «friend»

30
什么时候应该在C ++中使用“朋友”?
我一直在阅读C ++常见问题解答,并对friend声明感到好奇。我个人从未使用过它,但是我对探索这种语言很感兴趣。 使用的一个好例子是friend什么? 再读一遍FAQ,我喜欢<< >>运算符重载的想法,并添加为这些类的朋友。但是我不确定这不会破坏封装。这些例外什么时候可以保持在OOP的严格程度之内?
354 c++  oop  encapsulation  friend 

22
为什么C#不提供C ++样式的“ friend”关键字?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引文回答。 3年前关闭。 改善这个问题 在C ++朋友关键字允许class A指定class B作为其朋友。这允许Class B访问的private/ protected成员class A。 我从来没有读过任何关于为什么C#(和VB.NET)不包含此内容的信息。对于这个较早的StackOverflow问题的大多数答案似乎都是在说它是C ++的有用组成部分,并且有充分的理由使用它。以我的经验,我必须同意。 在我看来,另一个问题确实是在问如何friend在C#应用程序中执行类似的操作。尽管答案通常围绕嵌套类,但似乎并不像使用friend关键字那样优雅。 原始的《设计模式》一书在整个示例中都定期使用它。 因此,总而言之,为什么friendC#缺少它?在C#中模拟它的“最佳实践”方法是什么? (顺便说一句,internal关键字不是同一回事,它允许整个程序集中的所有类访问internal成员,而friend允许您为某个类提供对另一个类的完全访问权限)
208 c#  c++  design-patterns  oop  friend 


2
公共朋友交换成员功能
在对复制和交换惯用语的漂亮回答中,有一段代码我需要一些帮助: class dumb_array { public: // ... friend void swap(dumb_array& first, dumb_array& second) // nothrow { using std::swap; swap(first.mSize, second.mSize); swap(first.mArray, second.mArray); } // ... }; 然后他加了一张纸条 还有其他一些主张,我们应该为我们的类型专门使用std :: swap,在提供免费交换功能的同时提供类内交换,等等。但这都是不必要的:对交换的任何正确使用都将通过不合格的调用,我们的功能将通过ADL找到。一种功能会起作用。 随着friend我对“不友好”的条款一点,我必须承认。因此,我的主要问题是: 看起来像一个自由函数,但是它在类体内? 为什么这不是swap静态的?它显然不使用任何成员变量。 “任何正确使用交换的方法都会通过ADL找出交换”?ADL将搜索名称空间,对吗?但是它也可以在类内部查看吗?还是在这里friend进来? 附带问题: 随着C ++ 11,我要记住我的swaps的noexcept? 随着C ++ 11和它的范围,对,我应该将friend iter begin()和friend iter end()在类中以同样的方式?我认为friend这里不需要这个,对吗?


10
为什么C ++不允许继承友谊?
为什么友谊在C ++中至少不能有选择地继承?我知道出于明显的原因而禁止传递性和自反性(我说这只是为了避开简单的FAQ引用答案),但是缺少一些东西使virtual friend class Foo;我感到困惑。有人知道这个决定背后的历史背景吗?友谊真的只是一种有限的黑客手段,此后又进入了一些晦涩可敬的用途吗? 编辑以澄清问题:我是在谈论以下情况,而不是 A的孩子接触B或B及其孩子都接触的情况。我也可以想象有选择地授予对朋友功能的覆盖等的访问权限。 class A { int x; friend class B; }; class B { // OK as per friend declaration above. void foo(A& a, int n) { a.x = n; } }; class D : public B { /* can't get in A w/o 'friend …

5
C ++中的内部类是否自动成为朋友?
如果我在C ++中定义一个内部类,它是否自动成为包含它的类的朋友?例如,这合法吗: class Outer { public: class Inner { public: void mutateOuter(Outer& o); }; private: int value; }; void Outer::Inner::mutateOuter(Outer& o) { o.value ++; // Legal? Or not? } 我问,因为在某些我尝试过的编译器(VS2003)上,此代码无法正常工作,但我至少听说过它在某些编译器上确实有效。我无法在C ++规范中找到与此相关的部分,并且如果有人可以引用某些特定的东西,那就说这是合法的或不合法的,那将是很好的。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.