2015-09-14 3 views
1

Предположим, у меня есть класс Character: он содержит много переменных private, таких как positionX, PositionY, Atk, Def, Agi, Velocity и должен передать его функции, которая обрабатывает и изменяет переменные Character. Поскольку у меня так много переменных, как передать эти переменные? Должен ли я использовать getter и setter для каждой переменной? Какова наилучшая практика в этом отношении?Лучшая практика передачи многих переменных

Я думаю о создании класса struct, который содержит все эти переменные, поэтому я могу просто пройти этот класс struct, но я не знаю, является ли это хорошей практикой.

+2

Я буду голосовать за закрытие этого вопроса как слишком широкого, потому что существует множество разных подходов, но самый простой - почему бы не сделать эту функцию функцией-членом класса 'Character'? – Petr

+3

'Символ' уже является классом. Зачем тогда делать 'struct'? – CinCout

+0

Сделайте const getter в своем классе и передайте объект своего класса, где хотите. –

ответ

5

Если вы передадите только структуру, она будет скопирована. Эффективная практика заключается либо передать его в качестве эталона или в качестве константной ссылки, или даже как shared_ptr

void foo(const MyStruct& ms); 
void foo(MyStruct& ms); 
void foo(std::shared_ptr<MyStruct> ms); 
+1

Когда будет проходить 'std :: shared_ptr'? –

+1

Ну, вы можете передать 'const std :: shared_ptr &' esp. если 'foo' нужно сделать некоторые копии' shared_ptr'. Но передача «std :: shared_ptr» по значению обычно просто расточительна. –

2

Если функция изменяет приватные переменные, то функция должна быть, вероятно, являются функцией членом.

Если это не подходит, вы можете объявить функцию другом класса.

Если у вас есть много функций, которые не могут быть членами, но вам необходимо получить доступ к переменным-членам, и вам не нужна инкапсуляция, тогда подумайте о том, чтобы сделать их общедоступными.

+1

Это особенно справедливо для Java, но C++ также имеет автономные функции друзей. – edmz

+0

Дело в том, что у меня есть отдельный класс 'Command', который обрабатывает действие' Character', причина, по которой я делаю отдельный класс, заключается в том, что я могу использовать его, если у меня есть более одного символа, но имеет свою собственную уникальную команду 'Command' , Надеюсь, я не смущаю вас, ребята, извините. – GroniumArgor

+0

Не могли бы вы подробнее описать функцию друга класса? – GroniumArgor

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