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

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

Восстановить пароль Регистрация
 
pajah
0 / 0 / 0
Регистрация: 02.11.2013
Сообщений: 4
02.11.2013, 15:51     Проектирование класса #1
Доброго времени суток. Имеется класс 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 довольно увесист). Может, имеются какие-нибудь подходящие для этой задачи шаблоны проектирования?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.11.2013, 15:51     Проектирование класса
Посмотрите здесь:

C++ Проектирование и работа с классами
C++ курсовое проектирование на с++
C++ Проектирование и реализация класса
проектирование ОО- архитектуры C++
C++ Проектирование программы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
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
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
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
:)
Эксперт C++
4377 / 3220 / 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
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
02.11.2013, 16:49     Проектирование класса #7
А есть ли в Settings связанные друг с другом переменные, или они все не зависят друг от друга?
I.M.
 Аватар для 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
:)
Эксперт C++
4377 / 3220 / 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     Проектирование класса
Еще ссылки по теме:

C++ А.Александреску - Современное проектирование на C++
Проектирование класса Matrix и его использование - найти ошибки в коде C++
Проектирование классов C++

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

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

Текущее время: 00:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru