【问题标题】:Having a class method/variable only accessible from one other class?有一个只能从另一个类访问的类方法/变量?
【发布时间】:2012-01-02 23:55:37
【问题描述】:

我有 A 类和 B 类。A 类有一堆带有获取/集合的变量,但我只想从 B 类调用这些集合。我能想到的唯一方法是使集合受到保护,并从 A 类派生 B 类。但是 B 类最终会从 A 类继承一堆不必要的东西。

例子:

class A {
public:
void setHealth();
int getHealth();

private:
int health;
};

class B {
public:
void someMethod() { classAInstance.setHealth(); } //This should work

private:
A classAInstance;

};

A classAInstance;
classAInstance.setHealth(); //This should not work because its not being called from Class B

我希望我对我的问题的解释足以让您了解我需要什么。提前致谢!

【问题讨论】:

标签: c++ class methods


【解决方案1】:

您可以将设置器声明为protectedprivate,然后将B 声明为friendA

class A {
    friend class B;

    ...
};

有关更多详细信息,请参阅 C++ 常见问题解答:http://www.parashift.com/c++-faq-lite/friends.html

【讨论】:

  • 朋友的烦恼:现在,getter和setter不用再调用了,可以直接访问变量了。
  • @pmr 然后将变量设为私有,getter/setter 受保护,朋友 B 在受保护范围内?
  • @Tom:嗯? friend 提供对 private 成员的访问权限,无论您将 friend 声明放在何处。
  • @TomKnapen 我不知道访问说明符会更改 friends 的语义,并且找不到对此的参考。你能给我看一个吗?
  • @BenVoigt 很抱歉,我一直都是这样做的,但从未以这种方式测试过。我已经进行了快速测试,现在我看到访问说明符不会改变任何语义。因此我很抱歉,并想请你忽略我之前的评论:)
【解决方案2】:

如果您希望对 A 的所有访问都通过 B 并强制 B 不访问私有数据 不通过 A 的 set-/get- 成员函数...你可以做这样的事情(即使它不必要地复杂):

class A
{
  friend class B;
  void setValue(const int &value) { aData.x = value; }
  int getValue() const { return aData.x; }
  class AData
  {
    friend class A;
    int x;
  };
  AData aData;
};

class B
{
public:
  int getValue() const { return a.getValue(); }
  void setValue(const int &value) { a.setValue(value); }

private:
  A a;
};

【讨论】:

    【解决方案3】:

    您可以将班级B 设为A 的朋友:

    class B;
    class A {
        friend class B;
        // ...
    };
    

    【讨论】:

      【解决方案4】:

      使B 成为Afriend,从而允许它访问A 的私有(和受保护)成员:

      class A {
          friend class B;
      }
      

      【讨论】:

        猜你喜欢
        • 2015-01-21
        • 2014-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-07
        • 2020-11-24
        相关资源
        最近更新 更多