Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
[WRG]
52 / 52 / 37
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
1

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

06.02.2014, 10:33. Просмотров 1184. Ответов 16
Метки нет (Все метки)

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?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.02.2014, 10:33
Ответы с готовыми решениями:

Как вызвать виртуальную функцию из дочернего класса, если она определена и вызывается в конструкторе РОДИТЕЛЬСКОГО класса?
Ну то есть так: есть родительский и дочерний класс, в родительском определен виртуальная функция и...

Как вызвать метод родительского класса;
Собственно вопрос; Есть класс a и b; Класс b унаследован от класса a; И как теперь из класса b...

Как вызвать функцию из абстрактного класса?
Здравствуйте. Как мне вызвать функцию input с помощью указателя из класса People? При этом не...

Как вызвать функцию-член правильно для класса Person
Задача простая, ввести фамилию и имя и вывести их. Подскажите, как правильно написать функцию...

Как создать указатель на функцию-член класса и вызвать его?
Подскажите как правильно сделать, а в дальнейшем вызвать указатель на функцию член класса:...

16
dzrkot
zzzZZZ...
523 / 354 / 94
Регистрация: 11.09.2013
Сообщений: 2,040
06.02.2014, 10:52 2
C++
1
2
3
4
void foo::somefunc(bar &obj) //bar *obj
{
obj.somefunc();//obj->somefunc();
}
1
ValeryS
Модератор
8060 / 5944 / 788
Регистрация: 14.02.2011
Сообщений: 20,490
Завершенные тесты: 1
06.02.2014, 10:57 3
Цитата Сообщение от [WRG] Посмотреть сообщение
Как вызвать функцию родительского класса
ткни пальцем где у тебя родительский класс, а где дочерний?
0
[WRG]
52 / 52 / 37
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
06.02.2014, 11:00  [ТС] 4
Цитата Сообщение от ValeryS Посмотреть сообщение
ткни пальцем где у тебя родительский класс, а где дочерний?
Наверно, я неправильно выразился, тут ничего не наследуется. Я имел в виду то, что в листинге)
0
06.02.2014, 11:00
ValeryS
Модератор
8060 / 5944 / 788
Регистрация: 14.02.2011
Сообщений: 20,490
Завершенные тесты: 1
06.02.2014, 11:05 5
тогда зачем тебе передавать
Цитата Сообщение от [WRG] Посмотреть сообщение
Мне нужно как-то передать указатель на bar в foo?
foo у тебя член класса
немножко утрирую твой вопрос
как мне передать в int указатель на bar?( смешно?)
пересмотри иерархию
1
[WRG]
52 / 52 / 37
Регистрация: 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&)
0
Tulosba
:)
Эксперт С++
4759 / 3253 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
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();
}
1
[WRG]
52 / 52 / 37
Регистрация: 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, не знал, что так можно)
0
Tulosba
:)
Эксперт С++
4759 / 3253 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
06.02.2014, 11:20 9
Цитата Сообщение от [WRG] Посмотреть сообщение
класс bar описывает некий прибор, а класс foo некий датчик в этом приборе
Внутри прибора создаете экземпляр датчика (например через new), а в конструктор датчика передаете this (т.е. указатель на прибор). В датчике реализуете поле типа "указатель на прибор", которое инициализируется ранее переданным this.
1
[WRG]
52 / 52 / 37
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
06.02.2014, 11:24  [ТС] 10
Tulosba, вот именно это я и имел в виду, спасибо)
0
ValeryS
Модератор
8060 / 5944 / 788
Регистрация: 14.02.2011
Сообщений: 20,490
Завершенные тесты: 1
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)};

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

}
0
[WRG]
52 / 52 / 37
Регистрация: 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)};

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

}
я так и сделаю, выполняться будет на мкироконтроллере.
Для микроконтроллеров вы имеете в виду прерывания по таймеру? Если так, то наверно имеет смысл вызывать некую функцию, которая будет контролировать датчик, а в случае чего дернет и метод класса прибора. Тогда можно обойтись и без класса датчика. Может, так даже рациональнее будет, т.к. между вызовами этой функции можно еще что-то в фоне делать.
Просто в этот раз охота попробовать такой вариант, если не устроит, могу на прерывание потом повесить.
0
ValeryS
Модератор
8060 / 5944 / 788
Регистрация: 14.02.2011
Сообщений: 20,490
Завершенные тесты: 1
06.02.2014, 12:06 13
Цитата Сообщение от [WRG] Посмотреть сообщение
Для микроконтроллеров вы имеете в виду прерывания по таймеру?
не обязательно
есть еще и внешние прерывания, прерывания от USART, да много чего, от модели зависит
камень то какой?

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


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

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

Не по теме:

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

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

Не по теме:

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

0
06.02.2014, 12:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.02.2014, 12:39
Привет! Вот еще темы с ответами:

Вызвать функцию класса без создания объекта
Можно ли так сделать? Точнее я знаю что можно, но у меня не получается, я хочу чтобы вот например...

Предварительное объявление классов. Вызвать функцию до реализации класса
Приветствую, народ. Пытаюсь реализовать структуру типа патерна &quot;Посредник&quot;. И при реализации...

Спрятать указатель на функцию класса в map и вызвать из другого объекта
Товарищи, пишу примитивный &quot;tcp-сервер&quot;. В его задачи входит принятие соединений и получение...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.