【问题标题】:Template class friendship模板类友谊
【发布时间】:2014-09-30 16:43:33
【问题描述】:

我最近遇到了一段 c++ 代码,其中一个类成为了自己的朋友。正如我在不同的论坛上读到的那样,一个班级已经是自己的朋友。所以我想知道是否有一个特定的原因可以明确地让自己成为班级朋友。

另一个问题是,让班级成为自己的朋友的原因是什么?

也许有很多经验的人可以澄清这个话题。

这是代码示例,以说明我的问题:

template < typename T>
class Foo: public T
{
protected:
   template < typename U>
   friend class Foo;
}

【问题讨论】:

  • 你能给我们看看代码吗?我看不出有什么目的(类已经可以访问它自己的私有/受保护成员,无需自欺欺人)。
  • 我能想到的唯一原因是 1) 你不想花时间在代码生成器中的特殊情况上,所以它会出现在生成的代码中,或者 2) 过时的代码重构留下的,没有人注意到,因为编译器没有抱怨。
  • “我在不同的论坛上看到一个班级已经是它自己的朋友了。”这是错误的。
  • 它不是自己的朋友。 Foo 的任何模板实例化都将成为任何其他模板的朋友。关键的细节是类模板不是类型。
  • @AlexandraC:因为类是它自己的朋友这根本不是真的。您一直在阅读的这些论坛可能试图将友谊关系与访问班级的private 成员混为一谈,虽然建立友谊关系确实会授予这种访问权限,但这并不意味着班级是自己的朋友。

标签: c++ friend access-control


【解决方案1】:

确实没有必要让一个类成为它自己的朋友,除非它是一个模板类。例如下面的代码是有意义的:

template <class T>
class A
{
    template<class U>
    friend class A;
}

一个 STL 示例是 std::_Ptr_base,它是 std::shared_ptrstd::weak_ptr 的基类。

【讨论】:

  • 模板是一个很好的观察,因为模板类本身就是不同的类型。但是我想不出一个模板可以访问另一个模板不能访问的场景。
  • 谢谢!这就是我一直在寻找的答案。
  • std::_Ptr_base 是一个实现细节,不是标准的一部分。这三个都与 STL 无关。
  • @chris,我不确定你的意思。 STL 代表标准模板库,据我所知,智能指针是 C++11 的 STL 的一部分。不过,如果我错了,请纠正我。
  • @rashmatash,你可能会读到this
【解决方案2】:

它不是让这个类成为自己的朋友,而是让该模板的所有类成为所有其他人的朋友。所以A&lt;Foo&gt;A&lt;Bar&gt; 的朋友,这是一个不同的班级。

我很惊讶语法是你打印出来的,而不是template&lt;typename U&gt; friend class A&lt;U&gt;;,但这就是它的真正含义。

【讨论】:

猜你喜欢
  • 2021-12-06
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
  • 1970-01-01
  • 2013-10-10
相关资源
最近更新 更多