问题标签 [friend]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
6407 浏览

c++ - 如果类在命名空间下,友元函数不能访问私有函数

我在命名空间中有一个类,该类包含一个私有函数。并且有一个全局函数。我希望该全局函数成为我在命名空间内的类的朋友。但是当我把它作为朋友时,编译器认为该函数不是全局的,它位于该命名空间本身内。因此,如果我尝试使用全局函数访问私有成员函数,它就不起作用,而如果我在该命名空间本身中定义一个具有相同名称的函数,它就会起作用。下面是您可以看到的代码。

我也试着把朋友当朋友 void ::fun(); 它也无济于事。

0 投票
4 回答
311 浏览

c++ - C ++中未使用的朋友类

有没有办法检测(例如编译器警告)是否声明了类friend但不访问私有成员,即。当友谊无用?

0 投票
3 回答
12237 浏览

c++ - 有班级的朋友,但无法访问私人成员

朋友函数应该可以访问一个类的私有成员吧?那么我在这里做错了什么?我已经将我的 .h 文件包含在 operator<< 我打算与班级交朋友。

0 投票
1 回答
161 浏览

c++ - 适当使用朋友?用于操作特定类型对象的容器类

假设您可以FooManager管理多个类型的对象FooFooManager需要查看其 s 的某些部分以Foo评估其当前状态。在我使用一些访问器Foo来查看这些部分之前,直到我意识到这FooManager是唯一真正使用这些部分的类。我决定交FooManager个朋友Foo。这导致大部分课程Foo变为私人课程。

这是对朋友的适当使用吗?我的理由是它有助于封装,因为虽然它提供了FooManager对 's 内部的完全访问权限Foo,但它完全阻止了对其他所有内容的访问。

0 投票
1 回答
31234 浏览

c++ - 如何将模板化的结构/类声明为朋友?

我想做以下事情:

但是我的编译器(VC8)对此感到窒息:

我想要所有可能的朋友template struct foo的实例化。foo<T>T

我如何使这项工作?

编辑:这个

似乎可以编译,但它正确吗?朋友和模板的语法非常不自然。

0 投票
1 回答
1340 浏览

c++ - 模板朋友和嵌套类

请考虑以下代码:

我希望所有的实例都成为any的foo<T>::bar朋友。如果不是嵌套模板,则上面的语法可以正常工作。但是当我做例如foo<T>::bar<S>Sbar

MSVC8 (Visual C++ 2005) 不喜欢它:

如果我使用,编译器会给我同样的错误

反而。我怎样才能达到我想要的?

编辑:我仔细检查了(这里是早上,我并没有真正醒来),这似乎是一个VC8 错误

0 投票
4 回答
611 浏览

c++ - 为什么我不能在一个类中声明一个朋友是另一个类的私有成员?

给定以下代码:

为什么Screen类不能声明WindowMgr::relocateScreen成员函数为友元?Screen不想使用另一个类的这个私有成员函数,而只是希望该函数能够访问它自己的私有成员。

relocateScreen如果仅打算在WindowMgr类中使用,则将函数公开可能是糟糕的设计。同样,如果不打算在任何其他情况下访问私有成员,那么结交Screenof 的朋友可能是糟糕的设计。WindowMgrWindowMgr

我在哪里错了?什么是正确的方法?我是在自欺欺人吗?

0 投票
3 回答
54015 浏览

c++ - c++ 友元函数 - 运算符重载 istream >>

我的问题是关于友元函数以及重载 << 和 >>。据我了解,我认为友元函数可以(并且应该)直接访问私有成员变量。但是,在我在这里的情况下,当我使用“get”函数获取每个私有变量时,编译器只会接受我的 .cxx 文件。

这是我的头文件

这是我对应的 .cxx 文件,其中包含友元函数的实现

所以在这方面上面的友元算子编译正确。但是为什么我的运算符>>可以直接访问一个私有变量(是>> bignum.digits [i]),但其余的私有变量需要通过“获取函数”来检索

下面,当我尝试在这方面编写重载运算符时(我认为友元函数应该如何正确调用私有变量):

我得到以下错误。

我使用的编译器是 g++(版本 3.3.1)。任何帮助表示赞赏,谢谢。

修改:

我更新了代码,以便 bignum 对象可以访问私有变量。我对重载 << 的朋友运算符做了以下操作,它编译得很好。感谢您的评论,这是一个菜鸟的错误。

但是编译器仍然为 >> 运算符产生错误

BigNum2.cxx:在函数中std::istream& csci2270_hw1B::operator>>(std::istream&, csci2270_hw1B::BigNum&)': BigNum2.cxx:208: error: syntax error before)'令牌

>> 应该读入一个数字,私有成员变量“used”应该记录数组的长度。我仍然对编译器接受的原因感到有些困惑

相对于:

有什么想法吗?谢谢。

0 投票
3 回答
1844 浏览

c++ - 派生类可以使用基类的友元函数吗?

如果我有一些类基础,并从它派生,在基础内部我有朋友函数

在派生类内部我没有这样的功能所以我的问题是我的主要内部是否有

为什么它起作用?我没有任何用于强制转换的构造函数!= 提前感谢如果我写 if(派生!= 基础)它会工作吗?

0 投票
4 回答
3402 浏览

c++ - 如何命名这种面向密钥的访问保护模式?

显然这种面向密钥的访问保护模式

... 还没有一个已知的名称,因此我想为它找一个好的名称,这样我们就可以参考它而不会破坏我们的舌头。建议?

它应该是:

  • 简洁
  • 传达访问保护的意图
  • 理想情况下意味着不需要代理(?)