【问题标题】:Friend declaration for single member instead of whole class?单个成员而不是整个班级的朋友声明?
【发布时间】:2013-02-11 22:33:19
【问题描述】:

通常在 C++ 中,当 A 类声明与 B 类的友谊时,B 类可以完全访问 A 类的私有成员。我需要做的是允许 B 类只访问 A 类的一个私有成员,而不能访问其他任何东西。有什么办法吗,也许是 C++11 中的新东西?

【问题讨论】:

  • 将一个成员提取(声明)到它自己的类中,然后使该类成为A的父类和Bfriend? (虽然那时你可以只编码B 来定位所说的接口类,而不需要友谊。)
  • 继承可以做到这一点,因为友谊不是继承的。但是,您应该首先尝试找到一个不依赖于友谊的解决方案,因为尝试使用继承来解决与朋友的问题最终会变得非常复杂。
  • 一个getter/setter函数就足够了!!!!
  • 问题是 getter 太“公开”了。好吧,看来我需要重新设计它。
  • 在一个系统中(一组相关的类一起工作以提供一些功能)我觉得暴露私有是可以接受的。重要的是系统的用户(不是系统中任何一个特定类的用户)只能访问一个清晰的公共接口。

标签: c++ oop class c++11 friend


【解决方案1】:

我不知道。如果只允许访问单个成员真的很重要,您可以将数据包装在另一个具有完全私有成员的类 (C) 中,使该类成为 B 的朋友,并为 @987654323 提供公共访问器A中的@对象。

类似这样的:

template<class T> class MatesWithB
{
     friend class B;

  public:
     MatesWithB( T & val ) : data(val) {}

  private:
     T& data;
     operator T&()             { return data; }
     operator const T&() const { return data; }
};

class A
{
      // ...
      MatesWithB<int> GetPrivateThingy() { return MatesWithB(thingy); }

   private:
      int thingy;            // Shared with class B
};

类似的东西。我还没有通过编译器运行它来检查。

但我只是想知道...当您发现自己需要这样做时,您的设计中的某些东西是否存在根本缺陷?

【讨论】:

    【解决方案2】:

    假设您首先有充分的理由拥有一个朋友功能,那么我认为“信任”朋友功能不会接触它应该接触的其他东西并没有错。

    请记住,任何具有您的类地址的函数[或可以通过某种方式获取该地址]都能够在该函数希望这样做时修改成员变量。它可能无法以可移植的、未来安全可靠的方式进行,但将指针投射到char * 将能够修改操作系统未确定的类中的任何内容。

    关于privateprotectedpublicfriend 等的要点是让编译器检查你是否“遵守合同”——但它可以被“聪明”的程序员重写决心这样做。作为这个“契约”的一部分,friend 类或函数被允许接触它的朋友类中的任何东西。这就是来龙去脉。如果你不想这样,那么你不应该宣布它为朋友......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-07
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 2016-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多