Иметь метод / переменную класса, доступный только из одного другого класса? - PullRequest
1 голос
/ 03 января 2012

У меня есть класс A и класс B. В классе A есть куча переменных с get / sets, но я хочу, чтобы эти наборы вызывались только из класса B. Единственный способ, которым я могу думать об этом, - сделать наборы защищенными.и получение класса B из класса A. Но тогда класс 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

Надеюсь, я достаточно объяснил свой вопросчтобы вы понимали, что мне нужно.Заранее спасибо!

Ответы [ 4 ]

3 голосов
/ 03 января 2012

Вы можете объявить сеттеры как protected или private, а затем объявить B как friend из A:

class A {
    friend class B;

    ...
};

Подробнее см. В C ++ FAQ.: http://www.parashift.com/c++-faq-lite/friends.html.

1 голос
/ 03 января 2012

Если вы хотите, чтобы весь доступ к A проходил через B и приводил к тому, что B не имеет доступа к частным данным не пройдя функции set-get-member A ... вы можете сделать что-то вроде этого (даже если это излишне сложно):

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;
};
0 голосов
/ 03 января 2012

Сделать B a friend из A, что позволит ему получить доступ к A закрытым (и защищенным) членам:

class A {
    friend class B;
}
0 голосов
/ 03 января 2012

Вы можете сделать класс B другом A:

class B;
class A {
    friend class B;
    // ...
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...