Каков наилучший способ доступа к внутренней структуре данных в классе? - PullRequest
2 голосов
/ 10 октября 2011

У меня есть класс A, состоящий из набора внутренних структур данных (например, m_data) и нескольких объектов (например, ClassB):

class A
{
public:
      ...
private:
      int m_data[255];
      ClassB B[5];
}

Какой лучший способ для B получить доступ к m_data? Я не хочу передавать m_data в функцию B ..

// обновлено: Большое спасибо за ответы. Позвольте мне предоставить больше контекстной информации. Я работаю над проектом ИИ, где я получаю некоторые данные (например, m_data [i]) на каждом временном шаге. Класс A должен буферизовать эту информацию (m_data) и использует список B (пример обновлен), чтобы сделать вывод. Сам класс B на самом деле является базовым классом, где разные потомки наследуются от него для разных целей, поэтому, я думаю, в этом контексте превращение B в подкласс класса A может быть неочищенным (?)

Ответы [ 5 ]

4 голосов
/ 10 октября 2011

Один из:

  • Сделайте ClassB другом A
  • Сделать A подклассом ClassB и сделать m_data protected вместо private

[В ответ на комментарий Марка Б]

Если вы когда-нибудь почувствуете необходимость прибегнуть к отношениям friend, проект следует пересмотреть - он может быть неуместным. Подклассы могут иметь или не иметь смысла; вы должны спросить себя: "1016 * и это что-то вроде class ClassB?" Если вопрос не имеет смысла интуитивно, или ответ просто нет , то это может быть неуместным решением.

4 голосов
/ 10 октября 2011
friend class ClassB;

Поместите эту строку в любом месте декларации А, если вы хотите, чтобы ClassB имел доступ ко всем защищенным и закрытым членам А.

2 голосов
/ 10 октября 2011

В идеале, вы вообще не разрешаете внешний доступ к структуре данных. Вы должны переосмыслить свой подход, рассматривая больше вопрос «Каковы функциональные требования / варианты использования, необходимые для доступа ClassB к экземплярам A», а не перекладывать управление внутренними членами на методы, не управляемые в class A. Вы обнаружите, что ограничение управления внутренними членами класса, владеющего этими членами, приведет к более чистому коду, который легче отлаживать.

Однако, если по какой-то причине это нецелесообразно для вашей ситуации, на ум приходит пара вариантов:

  • Вы можете предоставить простые методы доступа get / set, которые в зависимости от ваши требования, могут быть использованы для доступа к копии или ссылка на m_data. Это имеет недостаток, позволяющий всем доступ, но делает это только через четко определенные интерфейсы (которые могут быть проверенным по мере необходимости).
  • ggPeti упоминает об использовании друга, который может работать для вас, но он предоставляет ClassB доступ ко всем внутренностям А.
0 голосов
/ 10 октября 2011

Какой лучший способ для B получить доступ к m_data?

Зависит от использования.

Вот как бы я это сделал:

class ClassB
{
  // ...
  void foo( A &a )
  {
    // use a's data
  }
};
class A
{
  //...
  int m_data[255];
  ClassB & B;
};

В зависимости от реализации, возможно, ClassB вообще не нужен. Может быть, это методы могут быть преобразованы в функции.

0 голосов
/ 10 октября 2011

Функция getData (), которая возвращает m_data. Используйте setData (), чтобы изменить значение.

Таким образом, в функции класса B вы должны создать указатель на переменную класса A, которую вы создали. Давайте просто назовем этот указатель 'p'.

Просто сделайте p-> getData (), p.getData () может быть ответом. Я думаю, что они делают то же самое, но c ++ использует «->», а некоторые другие языки используют «.». Не цитируйте меня, хотя.

Удачи, сэр. Надеюсь, я тебе помог.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...