使公共嵌套类的一部分仅对嵌套类可见 我有一个C++中嵌套的类,它必须是公共的。但我需要它的一些方法对外部世界可见,其余的只对嵌套类可见。即: class set { public: class iterator { innerMethod(); public: outerMethod(); } }

使公共嵌套类的一部分仅对嵌套类可见 我有一个C++中嵌套的类,它必须是公共的。但我需要它的一些方法对外部世界可见,其余的只对嵌套类可见。即: class set { public: class iterator { innerMethod(); public: outerMethod(); } },c++,friend,nested-class,friend-class,C++,Friend,Nested Class,Friend Class,我希望能够为set编写一个使用innerMethod()的方法。如果我把它公之于众,我也可以从外部访问它,这是我绝对不想要的。有没有一种方法可以不用做“好友类设置”的事情 提前谢谢 不,我认为除了使用friend-指令之外,没有其他非黑客方法 friend就是为了这种目的而存在的,你为什么要避免它呢?试着问:有没有办法不加两个数字就加上两个? 抱歉,如果我太苛刻了,但是朋友类正是为了…如果不使用朋友关键字,就没有好的方法可以做到这一点 你在评论中说: 在编程类中,我目前 拿着,用“朋友”据说是

我希望能够为set编写一个使用innerMethod()的方法。如果我把它公之于众,我也可以从外部访问它,这是我绝对不想要的。有没有一种方法可以不用做“好友类设置”的事情


提前谢谢

不,我认为除了使用
friend
-指令之外,没有其他非黑客方法


friend
就是为了这种目的而存在的,你为什么要避免它呢?

试着问:有没有办法不加两个数字就加上两个?
抱歉,如果我太苛刻了,但是朋友类正是为了…

如果不使用
朋友
关键字,就没有好的方法可以做到这一点

你在评论中说:


在编程类中,我目前 拿着,用“朋友”据说是 考虑不周 “糟糕的编程”在很大程度上, 除非真的没有别的办法 围绕着它。所以我尽量避免它 尽可能多

friend
破坏了封装,也许这就是为什么你的班主任说它是糟糕的编程但是成员函数也破坏了封装,那么为什么要使用它们呢?为什么不也避开它们呢
friend
以与成员函数相同的方式破坏封装当他们需要时,那么你应该舒服地使用<代码>朋友< /> >也>强>当需要时。两个都存在C++中的原因!
class set {
public:
 class iterator 
 {
  friend class set; //<---- this gives your class set to access to inner methods!

  void innerMethod(){}
 public:
  void outerMethod(){}
 };
 iterator it;

 void fun()
 {
  it.innerMethod();
  it.outerMethod();
 }
};
类集合{
公众:
类迭代器
{

friend类集合;//您可以执行以下操作:

类集

{

})

我不知道答案是否正确,但它现在确实使用了friend键,并且隐藏了一些方法。唯一的问题是,您不能声明privateIterator,并且必须始终使用CreateIterator来创建实例…

是的

我一直在提倡这种方法,基本思想是使用

虽然这实际上并没有删除使用
friend
,但它确实减少了公开的实现细节集

class set;

// 1. Define the Key class
class set_key: noncopyable { friend class set; set_key() {} ~set_key() {} };

class set
{

  // 2. Define the iterator
  class iterator
  {
  public:
    void public_method();

    void restricted_method(set_key&);

  }; // class iterator

}; // class set
现在,
restricted\u方法
是公开的,因此
set
不需要对
迭代器
进行任何特殊访问。但是,它的使用仅限于那些能够传递
set\u键
实例的人……并且只有
set
可以方便地构建这样的对象

请注意,
set
实际上可能会将
set\u key
对象传递给它信任的其他人。这是一把传统意义上的钥匙:如果你将公寓的钥匙交给某人,它可能会委托给另一个人。但是由于钥匙类的语义(不可复制,只有
set
可以构造和销毁它)这通常限于
对象范围的持续时间


注意,恶意黑客总是可能的,即<代码> *((StIsKy*)0)< /C>。该方案保护墨菲而不是马基雅维利(无论如何,C++中不可能)。< /P>为什么不使用<代码>朋友< /Cord>声明?不知道为什么你称它为“朋友类集合”。在引号中。需要明确的是,您可以使用

friend
与使用
public
完全相同的方法,这似乎并不困扰您。这正是
friend
声明改进封装的那种情况,因为显而易见的替代方法是完全破坏封装。在这种情况下,可能与friend或public>无关不是朋友。也许你的设计不好。请不要重新实现set。STL库已经提供了一个。@ds27680-我需要为类实现它。在现实生活中,如果我在STL库中有set类,我就不可能编写自己的set类。在我目前参加的编程课程中,使用“friend”被认为是不明智的,而且通常被认为是错误的“糟糕的编程”大部分情况下,除非真的没有其他办法。所以我尽量避免它。@Mokingbird:
friend
破坏封装,也许这就是为什么你们的班主任说它的样式不好。但是成员函数也破坏了封装,为什么要使用它们?@Mokingbird:听起来是个好机会问你估计。我个人很好奇为什么有人会说,
friend
是糟糕的编程实践。显然,像其他任何东西一样,应该谨慎使用它,而不是启用构思糟糕的OO设计,但当您需要它时,它的使用并没有本质上的错误。另请参见。@Nawaz-为什么成员函数会破坏封装计算?@Nawaz,你错了,
friend
增强了封装。那些说
friend
是糟糕风格的人还没有理解它的用途。它确实不经常有用,但有时确实有用。是的,有。你可以使用位运算符。糟糕的例子;-)我不会说没有办法,而是说“不容易”…我打赌我可以将该方法私有化,而不是使用friend并从外部类调用它。但这肯定不是一个好主意…事实上是这样。虽然它相对保密,但我已经为此多次提倡。它也不是特定于嵌套类。我已经添加了一个答案,希望能更接近这个答案在顶部,我描述了键的使用,这与Proxys或Advocate模式有点不同。封装的目的不是阻止用户使用您的类,而是让它可以控制对类成员的访问,以及一组预定义的函数/方法,这些函数/方法是按照您想要的方式完成的,而不是用户。F例如:在一个有理数类中,您将阻止用户直接访问分母
class set;

// 1. Define the Key class
class set_key: noncopyable { friend class set; set_key() {} ~set_key() {} };

class set
{

  // 2. Define the iterator
  class iterator
  {
  public:
    void public_method();

    void restricted_method(set_key&);

  }; // class iterator

}; // class set