Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Может ли 1 экземпляр класса знать о других? 
:(
    Опции темы
Нитонисе
Дата 6.4.2013, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: нет
Всего: 2



Проектирую класс. В нем есть свойство чем-то похожее на свойство Checked в RadioButton. То есть среди всех экземпляров класса в данный момент времени только у одного из них это свойство может быть равным true, соответственно у всех остальных это свойство равно false. Вот и вопрос - можно ли в методах класса вызывать методы своих сородичей? Ну например устанавливая свойство Checked в true нужно у всех сородичей это же свойство установить в false.

Это сообщение отредактировал(а) Нитонисе - 6.4.2013, 20:55
PM MAIL   Вверх
volatile
Дата 6.4.2013, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Нитонисе, сделать то можно все.
Но я бы в данном случае сделал еще один класс, скажем RadioButton_group.
т.е контейнер (в определенном смысле) этих самых RadioButton'ов.
В пределах этого контейнера, только один RadioButton может быть включен, остальные выключены.
за этим должен следить код этого самого контейнера.

Если же вы сделаете как вы просите, то у вас получицца глобальный RadioButton_group.
А если понадобицца второй?  smile 
PM MAIL   Вверх
Нитонисе
Дата 6.4.2013, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: нет
Всего: 2



Цитата(volatile @  6.4.2013,  21:26 Найти цитируемый пост)
Если же вы сделаете как вы просите, то у вас получицца глобальный RadioButton_group.А если понадобицца второй?

Да, такое может быть. Значит допустим есть класс группы. В одном из членов группы происходит событие, аналогичное OnClick в RadioButton. Как известить об этом событии класс группы? Наверное в классе должна быть ссылка на класс группы и при событии OnClick нужно вызывать метод класса группы наподобие UnCheckAll()?
PM MAIL   Вверх
volatile
Дата 7.4.2013, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(Нитонисе @  6.4.2013,  21:46 Найти цитируемый пост)
известить об этом событии класс группы? Наверное в классе должна быть ссылка на класс группы 

Можно и ссылку на группу хранить в объекте.
Хотя, вероятно, можно и чтобы событие OnClick, приходило сразу группе, с указанием номера члена, которому это событие предназначаецца.
А группа уже отправляет его нужному члену, и выключает других.
Тогда член может вообще ничего не знать о группе.


PM MAIL   Вверх
Alexeis
Дата 7.4.2013, 01:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Можно закольцевать объекты в циклический однонаправленный список. В случае возникновения события передавать его по цепочке пока оно не вернется начавшему. Есть только неудобство идентификации группы. Нужно где-то хранить указатель на один из элементов каждой группы. Также добавление в группу нужно будет делать внешними функциями. Функции есть, данные есть для этих функций, а их объединение уже суть новый объект smile .


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Нитонисе
Дата 7.4.2013, 01:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: нет
Всего: 2



Я реализовал эту идею. Но все же где-то как-то читал, что экземпляр класса может знать о существовании сородичей. Здесь тоже можно было бы использовать принцип группировки на основе индекса группы. Допустим часть экземплчров принадлежит группе с индексом 1, часть группе с индексом 2. Допустим в группе 1 одному из объектов присвоили уникальному свойству true, и автоматически пробежались по всем сородичам с таким же индексом группы, установив то самое свойство в false...
PM MAIL   Вверх
math64
Дата 8.4.2013, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Экземпляр класса может знать о других экземплярах того же класса - но в данном случае лучший вариант с группой экземпляров.
Но специальный класс для группы создавать не обязательно - можно использовать typedef.
Код

class RadioButton {
public:
typedef std::vector<RadioButton*> Group;
~RadioButton() { /* удалить из группы, если группа становится пуста, удалить группу */
Group* group() const { return m_group; }
void setGroup(Group* group) { /* добавить себя в группу*/ }
void check() { /*вызвать uncheck() для всех экземпляров из m_group, кроме себя */ }
void uncheck();
private:
Group* m_group;
}

PM   Вверх
baldina
Дата 8.4.2013, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(math64 @  8.4.2013,  09:19 Найти цитируемый пост)
~RadioButton() { /* удалить из группы, если группа становится пуста, удалить группу */

так кто владелец группы?

PM MAIL   Вверх
Guinness
Дата 8.4.2013, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: нет
Всего: 10



Если проецировать данную задачу на графический интерфейс, то там у всех этих объектов(RadioButton) есть parent, в котором они содержатся. Думаю можно плясать от этого. 
1). В классе держим статический список со всеми экземплярами класса. В конструкторе каждого объекта добавляемся в этотт список. 
2). Соответственно, дальше уже работаем по этому списку, т.е., если экземпляр класса помечают как активный(true), мы проходим по этому списку в поисках объектов с тем же parent`ом и делаем их неактивными(false).
3). При удалении объекта, в деструкторе удаляем себя из списка.

Можно делать и так. Но имхо, лучше наверно, не стоит.
PM MAIL   Вверх
baldina
Дата 8.4.2013, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(Guinness @  8.4.2013,  10:13 Найти цитируемый пост)
Если проецировать данную задачу на графический интерфейс, то там у всех этих объектов(RadioButton) есть parent, в котором они содержатся. 

в гуе этот парент может быть окном, в котором несколько групп кнопок. сама группа может задаваться неявно (номером группы, присвоенным каждой кнопке).
PM MAIL   Вверх
Guinness
Дата 8.4.2013, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: нет
Всего: 10



Цитата(baldina @  8.4.2013,  10:34 Найти цитируемый пост)
в гуе этот парент может быть окном, в котором несколько групп кнопок. сама группа может задаваться неявно (номером группы, присвоенным каждой кнопке).


Действительно, это так, не знал. Просто у меня привычка в GroupBox`ах компоновать такие вещи. Тогда можно посмотреть какой интерфейс уже предложен для групп http://qt-project.org/doc/qt-4.8/qbuttongroup.html

Тогда в моем примере, приведенном выше, нужно будет инициализировать объект id-группы (int). И работать по этим id. Но я думаю, придумывать велосипед не стоит.

Это сообщение отредактировал(а) Guinness - 8.4.2013, 10:54
PM MAIL   Вверх
Lukkoye
Дата 18.4.2013, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 23.3.2013

Репутация: 1
Всего: 1



гугли "статические члены класса"
И не нужны будут никакие дополнительные переменные в объектах
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0560 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.