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

Как вызвать функцию родительского класса? - C++

Восстановить пароль Регистрация
 
[WRG]
 Аватар для [WRG]
50 / 50 / 9
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
06.02.2014, 10:33     Как вызвать функцию родительского класса? #1
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
#include <iostream>
 
using namespace std;
 
class foo{
    void somefunc();
public:
    int i;
};
 
class bar{
    foo fooobj;
public:
    int j;
    void myfunc();
};
 
int main()
{
    bar myobj;
    return 0;
}
 
 
void foo::somefunc()
{
    // вызвать myfunc из bar
}
Мне нужно как-то передать указатель на bar в foo?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.02.2014, 10:33     Как вызвать функцию родительского класса?
Посмотрите здесь:

C++ Как вызвать виртуальную функцию из дочернего класса, если она определена и вызывается в конструкторе РОДИТЕЛЬСКОГО класса?
внук родительского класса не может работать с полями дедовского класса; почему? C++
C++ Как вызвать метод родительского класса;
C++ Предварительное объявление классов. Вызвать функцию до реализации класса
Как создать указатель на функцию-член класса и вызвать его? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
06.02.2014, 10:52     Как вызвать функцию родительского класса? #2
C++
1
2
3
4
void foo::somefunc(bar &obj) //bar *obj
{
obj.somefunc();//obj->somefunc();
}
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
06.02.2014, 10:57     Как вызвать функцию родительского класса? #3
Цитата Сообщение от [WRG] Посмотреть сообщение
Как вызвать функцию родительского класса
ткни пальцем где у тебя родительский класс, а где дочерний?
[WRG]
 Аватар для [WRG]
50 / 50 / 9
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
06.02.2014, 11:00  [ТС]     Как вызвать функцию родительского класса? #4
Цитата Сообщение от ValeryS Посмотреть сообщение
ткни пальцем где у тебя родительский класс, а где дочерний?
Наверно, я неправильно выразился, тут ничего не наследуется. Я имел в виду то, что в листинге)
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
06.02.2014, 11:05     Как вызвать функцию родительского класса? #5
тогда зачем тебе передавать
Цитата Сообщение от [WRG] Посмотреть сообщение
Мне нужно как-то передать указатель на bar в foo?
foo у тебя член класса
немножко утрирую твой вопрос
как мне передать в int указатель на bar?( смешно?)
пересмотри иерархию
[WRG]
 Аватар для [WRG]
50 / 50 / 9
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
06.02.2014, 11:06  [ТС]     Как вызвать функцию родительского класса? #6
Цитата Сообщение от dzrkot Посмотреть сообщение
C++
1
2
3
4
void foo::somefunc(bar &obj) //bar *obj
{
obj.somefunc();//obj->somefunc();
}
Тогда в каком порядке должны описываться оба класса? Если попробовать собрать мой код выше с вашими изменениями, будет это
C++
1
2
3
main.cpp:6:19: error: ‘bar’ has not been declared
main.cpp:25:6: error: prototype forvoid foo::somefunc(bar&)’ does not match any in class ‘foo’
main.cpp:6:10: error: candidate is: void foo::somefunc(int&)
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
06.02.2014, 11:15     Как вызвать функцию родительского класса? #7
Возможно ТС имеет в виду не наследование классов как таковых, говоря про родителя, а отношение между объектами (см. паттерн компоновщик)

Цитата Сообщение от [WRG] Посмотреть сообщение
‘bar’ has not been declared
Кликните здесь для просмотра всего текста
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
#include <iostream>
 
class bar;
 
class foo{
    void somefunc( bar& b );
public:
    int i;
};
 
class bar{
    foo fooobj;
public:
    int j;
    void myfunc()
    {
    }
};
 
int main()
{
    bar myobj;
    return 0;
}
 
 
void foo::somefunc( bar& b )
{
    // вызвать myfunc из bar
    b.myfunc();
}
[WRG]
 Аватар для [WRG]
50 / 50 / 9
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
06.02.2014, 11:19  [ТС]     Как вызвать функцию родительского класса? #8
Цитата Сообщение от [WRG] Посмотреть сообщение
Тогда в каком порядке должны описываться оба класса? Если попробовать собрать мой код выше с вашими изменениями, будет это
C++
1
2
3
main.cpp:6:19: error: ‘bar’ has not been declared
main.cpp:25:6: error: prototype forvoid foo::somefunc(bar&)’ does not match any in class ‘foo’
main.cpp:6:10: error: candidate is: void foo::somefunc(int&)
Да уж, я сегодня чего то туплю конкретно. У меня получается следующая конструкция, класс bar описывает некий прибор, а класс foo некий датчик в этом приборе, поэтому логично, что он являтся членом класса прибора. Я бы хотел запустить в классе датчика, т.е. foo, метод, который будет в цикле считывать показания с датчика, и если они превысят некий порог, надо дернуть соответствующий метод у прибора (bar). Вот это я имел в виду.

Добавлено через 2 минуты
Tulosba, не знал, что так можно)
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
06.02.2014, 11:20     Как вызвать функцию родительского класса? #9
Цитата Сообщение от [WRG] Посмотреть сообщение
класс bar описывает некий прибор, а класс foo некий датчик в этом приборе
Внутри прибора создаете экземпляр датчика (например через new), а в конструктор датчика передаете this (т.е. указатель на прибор). В датчике реализуете поле типа "указатель на прибор", которое инициализируется ранее переданным this.
[WRG]
 Аватар для [WRG]
50 / 50 / 9
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
06.02.2014, 11:24  [ТС]     Как вызвать функцию родительского класса? #10
Tulosba, вот именно это я и имел в виду, спасибо)
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
06.02.2014, 11:26     Как вызвать функцию родительского класса? #11
Цитата Сообщение от [WRG] Посмотреть сообщение
Я бы хотел запустить в классе датчика, т.е. foo, метод, который будет в цикле считывать показания с датчика, и если они превысят некий порог, надо дернуть соответствующий метод у прибора (bar). Вот это я имел в виду.
так, что то начинает прояснятся
под что пишешь
если под винду можно вызвать сообщения SendMessage PostMessage
если Qt то есть сигналы/ слоты
для микроконтроллеров есть прерывания
ну а в общем случае
могу предложить такую схемку
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class bar;
class foo
{
.......
bar* parent;
foo(bar* prnt){parent=prnt};
 
fnc(){ parent->func()};
}
 
class bar
{
foo* f1;
bar(){ f1=new foo(this)};

члену класса в конструкторе передается ссылка на объект класса

}
[WRG]
 Аватар для [WRG]
50 / 50 / 9
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
06.02.2014, 11:58  [ТС]     Как вызвать функцию родительского класса? #12
Цитата Сообщение от ValeryS Посмотреть сообщение
так, что то начинает прояснятся
под что пишешь
если под винду можно вызвать сообщения SendMessage PostMessage
если Qt то есть сигналы/ слоты
для микроконтроллеров есть прерывания
ну а в общем случае
могу предложить такую схемку
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class bar;
class foo
{
.......
bar* parent;
foo(bar* prnt){parent=prnt};
 
fnc(){ parent->func()};
}
 
class bar
{
foo* f1;
bar(){ f1=new foo(this)};

члену класса в конструкторе передается ссылка на объект класса

}
я так и сделаю, выполняться будет на мкироконтроллере.
Для микроконтроллеров вы имеете в виду прерывания по таймеру? Если так, то наверно имеет смысл вызывать некую функцию, которая будет контролировать датчик, а в случае чего дернет и метод класса прибора. Тогда можно обойтись и без класса датчика. Может, так даже рациональнее будет, т.к. между вызовами этой функции можно еще что-то в фоне делать.
Просто в этот раз охота попробовать такой вариант, если не устроит, могу на прерывание потом повесить.
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
06.02.2014, 12:06     Как вызвать функцию родительского класса? #13
Цитата Сообщение от [WRG] Посмотреть сообщение
Для микроконтроллеров вы имеете в виду прерывания по таймеру?
не обязательно
есть еще и внешние прерывания, прерывания от USART, да много чего, от модели зависит
камень то какой?

Цитата Сообщение от [WRG] Посмотреть сообщение
Тогда можно обойтись и без класса датчика.
можно в классе bar в цикле( по таймеру) опрашивать датчик
хотя я лично классы для микроконтроллеров не программировал
чистым Си обхожусь, как то пока хватает
[WRG]
 Аватар для [WRG]
50 / 50 / 9
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
06.02.2014, 12:14  [ТС]     Как вызвать функцию родительского класса? #14
Цитата Сообщение от ValeryS Посмотреть сообщение
не обязательно
есть еще и внешние прерывания, прерывания от USART, да много чего, от модели зависит
камень то какой?


можно в классе bar в цикле( по таймеру) опрашивать датчик
хотя я лично классы для микроконтроллеров не программировал
чистым Си обхожусь, как то пока хватает
это ATMega2560. Сам первый раз пробую ООП на мк, ибо памяти достаточно. Могу сказать сразу, что скомпилированный ооп код занимает существенно больше места во флеше, чем код без классов. На внешних прерываниях у меня другие датчики висят, эти я знаю как работают. С циклом с таймером тоже знаком, пользуюсь.

зато код структирированный и понятный, тоже самое без ооп у меня какая-то лапша получалась, даже терялся в нём.
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
06.02.2014, 12:32     Как вызвать функцию родительского класса? #15
Цитата Сообщение от [WRG] Посмотреть сообщение
зато код структирированный и понятный, тоже самое без ооп у меня какая-то лапша получалась, даже терялся в нём.
Цитата Сообщение от ValeryS Посмотреть сообщение
Я бы хотел запустить в классе датчика, т.е. foo, метод, который будет в цикле считывать показания с датчика, и если они превысят некий порог, надо дернуть соответствующий метод у прибора (bar). Вот это я имел в виду.
напишите функцию опроса датчика, напишите в обработчике прерываний по таймеру эту функцию, ну и соответственно бит порога этого дачика, потом в switch или по if дегайте чем хотите) это будет намного лучше
ValeryS
06.02.2014, 12:35
  #16

Не по теме:

dzrkot,
а чей ты мне чужую цитату приписал

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.02.2014, 12:39     Как вызвать функцию родительского класса?
Еще ссылки по теме:

C++ Как вызвать метод класса?
Как правильно вызвать функцию с указателем на другую функцию как параметр C++
Может ли метод родительского класса обратиться к полю дочернего класса C++

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

Или воспользуйтесь поиском по форуму:
dzrkot
06.02.2014, 12:39     Как вызвать функцию родительского класса?
  #17

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
Не по теме:
dzrkot,
а чей ты мне чужую цитату приписал
ой, сдучайно))

Yandex
Объявления
06.02.2014, 12:39     Как вызвать функцию родительского класса?
Ответ Создать тему
Опции темы

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