Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
Заблокирован

Можно ли из класса родителя просигналить всем потомкам?

11.07.2013, 10:18. Показов 1351. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Если есть базовый класс "X" и несколько его потомков "A", "B" и "C", можно ли как то через объект базового класса сообщить всем созданным потомкам выполнить какую - то функцию?

Например:
C++
1
2
3
4
5
6
7
8
9
10
X* x = new X;
A* a = new A;
B* b = new B;
C* c = new C;
 
//хочу как - то вызвать функцию, виртуальную наверно, 
//в классе "X", чтоб она вызвалась во всех потомках
 
x->DoWork();
//и после этого во всех классах потомках должна вызваться такая же функция
... ???
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.07.2013, 10:18
Ответы с готовыми решениями:

Присвоить значение всем потомкам родителя
Здравствуйте, имеется HTML: <ul id="controls"> <li><a class="goto-slide current" href="#" data-slideindex=""></a></li> ...

Можно ли в yii соединить (смержить) scope текущего класса со scope класса родителя?
Добрый день, Например есть: class ActiveRecord extends CActiveRecord { ... return , ];

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

12
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
11.07.2013, 10:22
babkaVkedah, Возможно. Сохранять все инстансы в базовом классе. Но это откровенно говоря изврат.
1
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2222 / 1424 / 419
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
11.07.2013, 10:35
babkaVkedah, не думаю, что это возможно по причине того что будет необходимо выполнить метод для всех наследников класса. А теперь вопрос: существеут ли в С++ способ/метод по умолчанию учета всех созданных объектов класса A, B, C? Насколько мне известно нет. Поля класса инициализируются при определении объектов и связи с базовым классом в последствии не несут. Что бы вызвать выполнение методов наследников базового класса необходимо ссылыться на каждый созданный объкт. Ну... примерно так.

Единственный вариант который мне приходит на ум это создание в базовом классе массива указателей на создаваемые объекты. Таким образом создавая новый объект вы автоматически сохраняете на него ссылку. Далее при вызове вашего метода он(метод) считывает адрес созданных объектов и вызывает их методы. Все это происходит в цикле по всему массиву указателей до встречи нулевого указателя. Как это реализовать это отдельный вопрос, но думаю суть ясна. Чем-то напоминат списки.
0
Заблокирован
11.07.2013, 10:53  [ТС]
У меня есть ещё вариант, задействовать Qt.
В базовом, да и во всех остальных, создать два метода Get и Set (set - signal, get - slot), чтоб можно было бы передавать что - то, например через строку джейсоновской натацией и получать что - то. Во всех классах потомках вызывать два connect, присоединяя Set потомка к Get родителя. А в базовом классе в слоте Get делать emit Set, чтоб при каждом получение Get из любого потомка, он испускал сигнал ко всем потомкам, ну как - то так
0
78 / 60 / 9
Регистрация: 26.06.2013
Сообщений: 198
11.07.2013, 13:58
Примитивный вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include <iostream>
#include <string>
#include <vector>
 
class Base
{
public:
    static void Signal()
    {
        for (std::vector<Base*>::iterator it = _instances.begin() ; it != _instances.end(); ++it)
        {
            (*it)->DoWork();
        }
    }
 
    virtual ~Base()
    {
        for (std::vector<Base*>::iterator it = _instances.begin() ; it != _instances.end(); ++it)
        {
            if (*it == this)
            {
                _instances.erase(it);
                break;
            }
        }
 
        std::cerr << "Calling method \'" << __FUNCTION__ << "\' for object \'" << _name << "\'\n";
    }
    Base(std::string const& name)
    {
        _name = name;
        _instances.push_back(this);
 
        std::cerr << "Calling method \'" << __FUNCTION__ << "\' for object \'" << _name << "\'\n";
    }
    virtual void DoWork()
    {
        std::cerr << "Calling method \'" << __FUNCTION__ << "\' for object \'" << _name << "\'\n";
    }
 
private:
    static std::vector<Base*> _instances;
 
protected:
    std::string _name;
};
std::vector<Base*> Base::_instances;
 
class DerivedA : public Base
{
public:
    virtual ~DerivedA()
    {
        std::cerr << "Calling method \'" << __FUNCTION__ << "\' for object \'" << _name << "\'\n";
    }
    DerivedA(std::string name) : Base(name)
    {
        std::cerr << "Calling method \'" << __FUNCTION__ << "\' for object \'" << _name << "\'\n";
    }
    void DoWork()
    {
        std::cerr << "Calling method \'" << __FUNCTION__ << "\' for object \'" << _name << "\'\n";
    }
};
 
class Derived2A : public DerivedA
{
public:
    virtual ~Derived2A()
    {
        std::cerr << "Calling method \'" << __FUNCTION__ << "\' for object \'" << _name << "\'\n";
    }
    Derived2A(std::string name) : DerivedA(name)
    {
        std::cerr << "Calling method \'" << __FUNCTION__ << "\' for object \'" << _name << "\'\n";
    }
    void DoWork()
    {
        std::cerr << "Calling method \'" << __FUNCTION__ << "\' for object \'" << _name << "\'\n";
    }
};
 
int main()
{
    Base* base = new Base("base");
    DerivedA derivedA("derivedA");
    DerivedA* derived2A = new Derived2A("deriveda2A");
 
    Base::Signal();
 
    delete derived2A;
    delete base;
    return 0;
}
1
419 / 418 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
11.07.2013, 19:50
паттерн проектирования "наблюдатель", не?
на Qt куда элегантнее будет
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
12.07.2013, 05:03
Цитата Сообщение от babkaVkedah Посмотреть сообщение
x->DoWork();
//и после этого во всех классах потомках должна вызваться такая же функция
Что мешает в этом месте вызвать эти функции?
0
78 / 60 / 9
Регистрация: 26.06.2013
Сообщений: 198
12.07.2013, 07:04
Цитата Сообщение от Кудаив Посмотреть сообщение
паттерн проектирования "наблюдатель", не?
В общем, да.
Цитата Сообщение от Кудаив Посмотреть сообщение
на Qt куда элегантнее будет
Не знаком, не знаю.
Цитата Сообщение от alsav22 Посмотреть сообщение
Что мешает в этом месте вызвать эти функции?
Наверное то, что не ведется yчет всех объектов-потомков.
0
Заблокирован
12.07.2013, 08:14  [ТС]
Цитата Сообщение от nxtech Посмотреть сообщение
Наверное то, что не ведется yчет всех объектов-потомков.
Конечно не ведётся, иначе какая же это автоматизация Думаю, лучший вариант - тот, который я сам предложил через Qt
0
78 / 60 / 9
Регистрация: 26.06.2013
Сообщений: 198
12.07.2013, 09:32
Ну, если Qt позволяет меньше писать кода, то, можно этим воспользоваться.
Но учет все-равно должен как-то где-то вестись, пусть это и скрыто от нас (connect как бы намекает).
0
Заблокирован
12.07.2013, 10:19  [ТС]
Цитата Сообщение от nxtech Посмотреть сообщение
Но учет все-равно должен как-то где-то вестись, пусть это и скрыто от нас
В том то и дело, что не надо
Фишка в том, что как я и говорил, в базовом классе делаешь SET и GET, а коннектишся к ним только в дочерних классах. Тоесть в дочернем классе надо просто иметь указатель на базовый и делать два коннекта.
Кстате, как лучше получить указатель на базовый класс в дочерних?
Как известно this, возвращает указатель на данный класс, может есть какая - то конструкция для получения указателя родителя? Может он так же как и для this где - то не явно храниться? Или же надо в базовом классе передавать указатель на самого себя в конструкторе?
0
78 / 60 / 9
Регистрация: 26.06.2013
Сообщений: 198
12.07.2013, 10:59
Цитата Сообщение от babkaVkedah Посмотреть сообщение
В том то и дело, что не надо
Ну, может я не совсем понятно и корректно выражаюсь. Но вот понятно, что объект генерирующий сигнал, не обязан ничего знать о получателях сигнала (более того, получателей может и не быть вовсе) и, соответственно, получатели не обязаны ничего знать об объекте генерирующем сигнал.
Но сама внутренняя реализация механизма сигналов-слотов должна же как-то знать какие адреса (функции) вызывать при поступлении сигнала.
0
49 / 23 / 3
Регистрация: 16.11.2011
Сообщений: 329
Записей в блоге: 5
12.07.2013, 22:10
nxtech, кладу в избранное, как пособие по наследованию)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.07.2013, 22:10
Помогаю со студенческими работами здесь

Вызов слота класса потомка при вызове сигнала класса родителя
Всем привет. Ситуация следующая. Есть класс родитель &quot;class1&quot;. В нём объявлен и вызывается сигнал &quot;signal&quot;. Есть класс...

Передача управления из конструктора класса-родителя в конструктор класса-потомка
Здравствуйте. Возможно ли передать управление из конструктора класса-родителя в конструктор класса-потомка? Например, есть класс...

Правда, что указатель класса-наследника не может указывать на объект класса-родителя?
Доброго времени суток! Пример кода ниже. Правда ли , что указатель класса-наследника не может указывать на объект класса-родителя? ...

Инициализация членов дочернего класса членами класса родителя
Есть уже созданный класс-родитель A. Как эффективно инициализировать дочерний класс B членами класса A?

Задачка для новичков #2: вывести в методе класса-родителя значение данных-членов из дочернего класса
Вдохновленный соседней темой тоже решил задать свой вопрос таким же начинающим программистам как и я :) Все кто хочет попробовать дать...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru