Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
pajah
0 / 0 / 0
Регистрация: 02.11.2013
Сообщений: 4
#1

Проектирование класса - C++

02.11.2013, 15:51. Просмотров 445. Ответов 10
Метки нет (Все метки)

Доброго времени суток. Имеется класс Player, в нём — приватный объект типа Settings.
Как наиболее лаконично обратиться извне к публичным методам Settings?
C++
1
2
3
4
5
6
7
8
9
10
class Settings {
private:
  // Около 100 переменных
public:
  // Геттеры и сеттеры для этих переменных
};
 
class Player {
  Settings settings;
};
Из вариантов — для Player создать публичную функцию:
C++
1
Settings getSettings() { return settings; }
Но такой путь будет слишком накладным (учитывая, что класс Settings довольно увесист). Может, имеются какие-нибудь подходящие для этой задачи шаблоны проектирования?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2456 / 1628 / 238
Регистрация: 24.11.2012
Сообщений: 4,003
02.11.2013, 16:03     Проектирование класса #2
Settings точно должны быть частью Player'a?
А так, вернуть можно указатель или ссылку, чтобы избежать копирования.
pajah
0 / 0 / 0
Регистрация: 02.11.2013
Сообщений: 4
02.11.2013, 16:20  [ТС]     Проектирование класса #3
Да, Settings — это настройки именно для Player в удобной обёртке.
В указатель завернуть можно, но тогда нарушается инкапсуляция — settings станет доступным для записи, что нехорошо.
0x10
2456 / 1628 / 238
Регистрация: 24.11.2012
Сообщений: 4,003
02.11.2013, 16:30     Проектирование класса #4
Указатель на константу. Или указатель на константный интерфейс. Вроде
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct ISettings {
    virtual int get_param_a() const = 0;
    virtual int get_param_b() const = 0;
    virtual int get_param_b() const = 0;
};
 
typedef /* bla bla */ ISettingsPtr;
 
class Player {
public:
    ISettingsPtr getSettings() const;
};
Добавлено через 7 минут
Upd: лучше просто указатель или ссылку на константу. Писанины меньше. Хотя... По вкусу.
Для параноиков можно класс Settings сделать приватным внутри Player, а наружу выставить только интерфейс ISettings.
Tulosba
:)
Эксперт С++
4391 / 3234 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
02.11.2013, 16:39     Проектирование класса #5
0x10, виртуального деструктора не хватает.
Max Dark
02.11.2013, 16:44
  #6

Не по теме:

Цитата Сообщение от pajah Посмотреть сообщение
Доброго времени суток. Имеется класс Player, в нём — приватный объект типа Settings.
C++
1
  // Около 100 переменных
не Писец ли?
как по мне жирненький такой

Tulosba
:)
Эксперт С++
4391 / 3234 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
02.11.2013, 16:49     Проектирование класса #7
А есть ли в Settings связанные друг с другом переменные, или они все не зависят друг от друга?
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
02.11.2013, 17:03     Проектирование класса #8
C++
1
const Settings& getSettings() const { return settings; }
и никаких накладных расходов. т.е. возвращаем не копию, а ссылку
pajah
0 / 0 / 0
Регистрация: 02.11.2013
Сообщений: 4
02.11.2013, 17:37  [ТС]     Проектирование класса #9
Цитата Сообщение от Tulosba Посмотреть сообщение
А есть ли в Settings связанные друг с другом переменные, или они все не зависят друг от друга?
Нет, переменные независимы.
Цитата Сообщение от Cra3y Посмотреть сообщение
не Писец ли? как по мне жирненький такой
В РПГ-игре использую класс для описания всевозможных параметров персонажа, отсюда и такое огромное количество равнозначных переменных. Можно, конечно, воспользоваться ассоциативными массивами, но нужно ли?

Действительно, в этой гонке за сокрытием данных я совсем забыл про ссылки. Можно попробовать и вариант с указателями и поиграться там с const.
0x10, Tulosba, I.M. — всем спасибо!
Tulosba
:)
Эксперт С++
4391 / 3234 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
02.11.2013, 17:42     Проектирование класса #10
Цитата Сообщение от pajah Посмотреть сообщение
Нет, переменные независимы.
Тогда, почему бы не использовать простую структуру, без методов доступа? Если, конечно, не нужно какие-то хитрые действия (логирование например) выполнять при чтении/установке.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.11.2013, 17:49     Проектирование класса
Еще ссылки по теме:

Проектирование класса Matrix и его использование - найти ошибки в коде C++
Проектирование классов C++
Проектирование ООП программы C++
C++ Проектирование класса Стек Растений
Проектирование настольных игр C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
pajah
0 / 0 / 0
Регистрация: 02.11.2013
Сообщений: 4
02.11.2013, 17:49  [ТС]     Проектирование класса #11
Цитата Сообщение от Tulosba Посмотреть сообщение
Тогда, почему бы не использовать простую структуру, без методов доступа?
При изменении каждого отдельного свойства происходит вывод на экран соответствующего сообщения. Но на досуге попробую слегка изменить логику программы — со структурами действительно было бы проще.
Yandex
Объявления
02.11.2013, 17:49     Проектирование класса
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru