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

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

11.07.2013, 10:18. Показов 1366. Ответов 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
2224 / 1426 / 420
Регистрация: 16.05.2013
Сообщений: 3,646
Записей в блоге: 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
5500 / 4895 / 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
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru