问题标签 [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 投票
3 回答
3142 浏览

vb.net - 如何在 VB .NET 中对单独项目中的私有函数进行单元测试?

当我开发代码时,我经常想对一个类的一些构建块进行单元测试,即使它们通常是私有的。如果我的单元测试在项目内部,我可以使用“朋友”来完成此操作,并且仍然保持功能私有以供正常使用。但我宁愿将我的 NUnit 测试转移到他们自己的单独项目中。如何达到我想要的效果?

0 投票
2 回答
14412 浏览

c++ - 声明朋友时必须声明类键

当我这样声明一个朋友时,g ++编译器会抱怨这个错误:

代替

为什么需要class关键字?(Borland C++ 编译器 BTW 不需要它。)

编译器不能简单地在符号表中查找 MyClass 并告诉它被声明为一个类吗?(显然它无论如何都在进行查找,因为它在未声明 MyClass 时会抱怨)

这不像是对类进行前向声明:我仍然必须在上面声明类或至少前向声明它。

如果这对我来说很有意义(实际上会很棒)

如果需要,可以进行前向声明,否则对我来说就像是语法盐。

近 20 年来,我一直在愉快地使用没有classstruct关键字且没有编译器投诉的朋友语句。这是相当新的东西吗?

0 投票
3 回答
11404 浏览

c++ - 让模板参数成为朋友?

例子:

现在这不起作用......有没有办法做到这一点?

我实际上正在尝试制作这样的普通类封口机:

我在这个网站的某个地方找到了这个例子,但我找不到它......(在这里

我知道还有其他方法可以做到这一点,但现在我很好奇你是否真的可以做这样的事情。

0 投票
5 回答
3757 浏览

c++ - C ++中的朋友类/函数

可能重复:
什么时候应该在 C++ 中使用“朋友”?

我看到很多人推荐一个函数/类成为 SO 中另一个类的朋友,尽管还有其他选择。在 C++ 中不应该少用朋友吗?我觉得在决定使用朋友功能之前必须考虑其他选项。欢迎提出意见/建议。

0 投票
4 回答
1967 浏览

c++ - 在编译时将继承限制为所需数量的类

我们有一个限制,一个类不能作为超过 7 个类的基类。有没有办法在编译时强制执行上述规则?

我知道 Andrew Koenig 的 Usable_Lock 技术可以防止类被继承,但只有当我们尝试实例化该类时它才会失败。自己推导时不能这样做吗?

允许基类知道谁是它的孩子。所以我想我们可以声明一个朋友类的组合并封装它们来执行这个规则。假设我们尝试这样的事情

类 CC 的派生将生成编译器警告 abt inaccessible dtor。然后,我们可以使用编译器调整将此类警告标记为错误(例如将所有警告标记为错误),但我不想依赖此类技术。

另一种方式,但在我看来相当笨拙的是: -

类 D 的派生将被标记为编译器错误,这意味着要派生的所有类都应在类 B 中派生。这将允许至少检查从类 A 派生的类的数量,但不会阻止任何人添加更多.

这里有人有办法吗?如果基类不需要知道谁是它的孩子,那就更好了。

注意:作为基类的类本身可以被实例化(它不是抽象的)。

提前致谢,

EDIT-1:根据 jon.h 的评论,稍作修改

0 投票
2 回答
242 浏览

c++ - 当涉及多个模板类型时,是否可以缩小类和函数之间的朋友关系?

假设我将一个图像类表示为:

我需要自己的交换功能来防止额外复制图像,所以我需要让它成为 Image 的朋友。如果在图像内我写:

我得到了我想要的,但它使所有交换函数成为所有 Image 类的朋友。所以我可以缩小朋友关系如下:

C++ FAQ-lite 35.16中所述。

现在假设我还有一个可以采用浮点或整数内核的卷积函数:

卷积需要访问 Image 的原始内存,所以它也必须是一个朋友。但是,我想部分缩小友谊,以便 convolve 是所有 KernelValues 的朋友,但仅限于特定的 Pixel 类型,例如:

在图像定义中。编译器根本不喜欢这个(或其他变种),主要是因为它与原始函数声明不匹配,因此无法访问私有指针。是否有可能在这里得到我想要的,或者我应该满足于“更友好”的版本?

0 投票
2 回答
4179 浏览

c++ - 如何从另一个父类是数据类的朋友类的派生类访问数据类的私有成员变量?

我有三个班级:

  1. 使用 Pimpl 模式的数据持有者类 CDataHolder

    /li>
  2. 一个基类CBase,需要访问CDataHolder中的iPImpl成员,所以是CDataHolder的友元类

    /li>
  3. CBase 的派生类 CDerived,它也需要访问相同的 iPimpl 成员。这里出现问题。尽管其父类是友元类,但派生类不能使用 iPimpl 成员。像这样:

    有很多派生类,所以每个派生类在 CDataHolder 类中放置“朋友类 CDerivedXXX”行并不是一个好方法。如何克服这个问题?有一个更好的方法吗?提前致谢。

0 投票
3 回答
25927 浏览

c++ - 如何允许模板功能有朋友(-like)访问?

如何修改以下代码以允许模板函数ask_runUI()s_EOFs_EOF公开的情况下使用?

0 投票
2 回答
713 浏览

c++ - 为什么我不能成为模板参数的朋友?

在研究问题的答案时(基于此答案),我尝试执行以下操作:

这无法编译并出现以下错误:

错误:模板参数“T”不能在详细类型说明符朋友类 T 中使用;

从我的好朋友谷歌那里可以了解到,这样我就不会意外地尝试实例化friendly<int>,但为什么在编译模板时会出现错误?用无效类型实例化模板时不应该是错误吗(比如我写的int f() { return T::foo(); }

0 投票
10 回答
9489 浏览

c++ - 朋友关键字(类/函数)如何打破 C++ 中的封装?

一些程序员说,“友元函数破坏了 C++ 中的封装”。一些程序员还说,“朋友函数不会破坏封装;相反,它们自然地扩展了封装屏障”

这是什么意思?..

如果友元函数破坏了 C++ 中的封装,那该怎么办?