问题标签 [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 回答
5391 浏览

c++ - 我们能否增加这种面向密钥的访问保护模式的可重用性?

我们能否增加这种面向密钥的访问保护模式的可重用性:

为避免继续产生误解,此模式与Attorney-Client惯用语不同:

  • 它可以比 Attorney-Client 更简洁(因为它不涉及通过第三类代理)
  • 它可以允许访问权限的委派
  • ...但它对原始类也更具侵入性(每个方法一个虚拟参数)

(在这个问题中展开了边讨论,因此我打开了这个问题。)

0 投票
6 回答
8244 浏览

c++ - 如何让 boost::make_shared 成为我班的朋友

我编写了一个带有受保护构造函数的类,因此只能使用静态 create() 函数生成新实例,该函数将 shared_ptr's 返回给我的类。为了提供有效的分配,我想在 create 函数中使用 boost::make_shared,但是编译器抱怨我的类构造函数在 boost::make_shared 中受到保护。我决定将我的 boost::make_shared 分享给班上的一个朋友,但我对语法感到困惑。我试过了

但是编译器给了我语法错误。请帮忙。

0 投票
1 回答
256 浏览

c++ - 好友功能和模板

我的问题与这个问题有关。

为什么上面的代码不能编译?

0 投票
2 回答
265 浏览

c++ - c++中的模板类和friend关键字(具体例子参考boost::multi_index)

所以你有一个班级员工

并且您有用于封装的私有数据成员。但是现在你想使用 boost::multi_index....

所以我可以使用 BOOST_INDEX_CONST_MEM_FUN ...

但我真正想做的是授予employee_set 访问我的员工类的私有数据成员的权限。我只是不知道该怎么做:-/

0 投票
2 回答
340 浏览

c++ - 模板化 << 朋友在与其他模板化联合类型有相互关系时不工作

在处理我的基本向量库时,我一直在尝试使用一种很好的语法来进行基于 swizzle 的打印。尝试打印与所讨论的向量不同维度的调酒时会出现问题。在 GCC 4.0 中,我最初为每个向量中的每个维度使用了朋友 << 重载函数(带有一个主体,即使它重复了代码),这导致代码工作,即使实际上从未调用过非本机维度代码. 这在 GCC 4.2 中失败了。我最近意识到(愚蠢的我)只需要函数声明,而不是代码主体,所以我这样做了。现在我在 GCC 4.0 和 4.2 上都得到了同样的警告:

加上其他函数声明的五个相同警告。

下面的示例代码准确地展示了正在发生的事情,并包含重现问题所需的所有代码。

该代码工作并产生正确的输出,但我更喜欢尽可能无警告代码。我遵循了编译器给我的建议(在此处总结并由论坛和 StackOverflow 描述为该警告的答案),并添加了两件本应告诉编译器发生了什么的事情。也就是说,我在模板联合的预定义之后将函数定义添加为非朋友:

并且,对于导致问题的每个友元函数,我<>在函数名称后添加了一个,例如 VECTOR2 的情况:

但是,这样做会导致错误,例如:

LINE 139: error: no match for 'operator<<' in 'std::cout << my2dVector.VECTOR2<float>::xxx'

这是怎么回事?是与这些模板化的类联合类结构如何相互关联有关,还是由于联合本身?

更新

在重新思考所涉及的问题,并听取了 Potatoswatter 的各种建议后,我找到了最终的解决方案。与互联网上几乎每个 cout 重载示例不同,我不需要访问私有成员信息,但可以使用公共接口来做我想做的事。因此,我为调用真正的友元重载函数的调酒部分创建了一个非友元重载函数。这绕过了编译器对模板化友元函数的问题。我已添加到我的项目的最新版本。它现在适用于我尝试过的两个 GCC 版本,没有任何警告。有问题的代码如下所示:

0 投票
3 回答
938 浏览

c++ - C ++访问朋友类->成员->公共方法?

以下代码在 C++ 中是否合法。访问朋友类成员的公共方法?我知道这听起来令人困惑,最好的方式是在代码中展示它。我想知道 TestClassC::Method() 在下面的代码中是否有效?

我已经编译(g++)并且它可以工作,但是,我遇到了一种情况,它在 TestClassC::Method() 的其他机器/发行版上产生分段错误。这让我想知道 this->classA_Ptr->classB.Method(); 在 C++ 中是合法的。

0 投票
2 回答
994 浏览

c++ - 一个类模板的两个实例化之间的 C++ 朋友比较

我正在尝试编写一个类模板,该模板在具有不同模板类型的两个实例之间提供比较运算符。通常情况下,此操作员是非会员朋友。下面可以看到我试图实现的简化示例。

此示例(g++ 4.4.0)无法编译:相反,它抱怨y_fromWrapper<Y>是私有的,因此朋友函数无法访问,我明白了原因。但是我该如何解决这个问题?在反向功能中添加友谊

进入 Wrapper 类模板体只会导致编译器产生歧义。我不想让 Wrapper 类的不同实例能够访问彼此的私有成员——我想限制对这个操作符的访问。这可能吗?

我的笔记本电脑因被关闭而处于危险之中,因此我和笔记本电脑(以及与此相关的窗口)都会接受任何想法。

0 投票
2 回答
84 浏览

c++ - 在类成员中调用函数 (C++)

ZH

Xh

主类.h

X.cpp

我应该怎么做才能DoSomethingNasty()_z对象调用函数?

0 投票
10 回答
62753 浏览

c++ - 为什么 C++ 不允许继承友谊?

为什么友谊至少不能在 C++ 中选择性地继承?我理解传递性和反身性被禁止的原因很明显(我这样说只是为了阻止简单的常见问题解答引用答案),但是缺乏类似的东西让virtual friend class Foo;我感到困惑。有谁知道这个决定背后的历史背景?友谊真的只是一种有限的黑客行为,后来进入了一些不起眼的可敬用途吗?

编辑澄清:我说的是以下场景,而不是A 的孩子暴露于 B 或 B 及其孩子。我还可以想象有选择地授予对朋友功能的覆盖等的访问权限。

接受的答案:正如Loki 所说,可以通过在友元基类中创建受保护的代理函数或多或少地模拟效果,因此没有严格需要为类或虚拟方法层次结构授予友谊。我不喜欢样板代理的需要(友好的基础实际上变成了),但我认为这被认为比大多数时间更可能被滥用的语言机制更可取。我想我可能是时候购买并阅读 Stroupstrup 的The Design and Evolution of C++ 了,我在这里看到了足够多的人推荐它,以便更好地了解这些类型的问题......

0 投票
4 回答
442 浏览

c++ - 结交班级

我正在尝试与一个类成为朋友,以便它能够访问它的私有构造函数。

在 some_file.h

在 other_file.h

编译此代码时,我得到 - 错误:'some_name::A::A(int)' is private。

我现在,它是私人的,这就是我与 B 成为朋友的原因。我在这里做错了什么?你不能和你的构造函数交朋友吗?有命名空间问题吗?

谢谢