2016-12-29 5 views
0

У меня есть два класса под названием Data и A. Класс A - это в основном набор функций, которые управляют данными в Data. Теперь мне нужно, чтобы A получил доступ ко всем данным в Data. Я знаю два способа сделать это.класс, мутирующий данные другого класса

  1. Я могу передать ссылку данных в A, но тогда мне всегда приходится писать префикс «Данные». который, я думаю, действительно раздражает, и в любом случае нет никакой двусмысленности.

  2. Я могу сделать A суперкласс данных. Но некоторые методы в A вызывают другой класс B, который также мутирует класс Data, и в этом подходе я не уверен, как это можно сделать.

Так что мой вопрос: есть ли другой способ для доступа к данным в Data, которые были бы более подходящими?

+3

Из того, что вы описываете, кажется, вы разделили класс на два: один хранит данные, другой содержит код который работает с данными. В ООП данные и код, которые его обрабатывают, относятся к одному классу. – axiac

+0

Но пара классов работает с данными, и все, что помещается в один огромный класс, кажется мне неправильным. – user3726947

+3

Если класс огромен, вы можете сказать, что он действительно соблюдает [принцип единой ответственности] (https://en.wikipedia.org/wiki/Single_responsibility_principle)? Возможно, ключ состоит в том, чтобы разбить функциональность на несколько классов, а не передавать функции в другой класс. Проверьте [SOLID] (https://en.wikipedia.org/wiki/SOLID_ (object-oriented_design)) и посмотрите некоторые [дяди bob vids] (https://www.youtube.com/results?search_query=uncle+ bob + martin) на youtube. –

ответ

1

Концепция, которую вы ищете, называется классом friend. Друг классы имеют доступ к закрытым членам класса они объявлены. Так что, вы бы что-то вроде

class A; //Forward declaration 
class Data 
{ 
friend class A; //Forward friend declaration, instances of A 
       //can access private members of Data 
public: 
    //Implementation details 
private: 
    int m_myData; 
}; 

class A 
{ 
    //Do whatever to an instance of Data (probably take it by reference) 
public: 
    void multiplyData(Data &data, int multiple) { data.m_myData *= multiple; } 
}; 
+0

просто указатели доступа не влияют на смысл объявлений друзей; то, как вы его отложили под «частным», может вызвать путаницу в том, что это как-то частное заявление. Это чисто эстетика, но все же. –

+0

@TasosPapastylianou Да, хороший момент. Спасибо, что упомянул об этом. Это было действительно для эстетики, но я отредактирую его, чтобы переместить его после объявления начального класса. Еще раз спасибо. –

+0

Но здесь мне еще нужно писать данные. все время ... – user3726947

-1

Если речь идет о получить доступ к данным из класса А, а затем объявить данные как глобальные. Вы можете очень хорошо получить доступ кем угодно. Это может быть и класс А. Используйте данные класса в качестве заголовочного файла для реализации класса А, все публичные члены Data будут доступны классу A.

+0

Это самое худшее, что вы могли бы сделать. Пожалуйста, прочитайте эту тему: http://softwareengineering.stackexchange.com/questions/148108/why-is-global-state-so-evil –

+0

Да, вы правы, глобальные данные злы. Спасибо – Jitendra

+0

Это может быть использование данных класса в качестве файла заголовка и доступ ко всем его членам. – Jitendra

Смежные вопросы