С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
[WRG]
51 / 51 / 9
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
#1

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

06.02.2014, 10:33. Просмотров 867. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.02.2014, 10:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как вызвать функцию родительского класса? (C++):

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

Как вызвать метод родительского класса; - C++
Собственно вопрос; Есть класс a и b; Класс b унаследован от класса a; И как теперь из класса b вызвать функцию класса a;

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

Как создать указатель на функцию-член класса и вызвать его? - C++
Подскажите как правильно сделать, а в дальнейшем вызвать указатель на функцию член класса: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; ...

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

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

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

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

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

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


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

зато код структирированный и понятный, тоже самое без ооп у меня какая-то лапша получалась, даже терялся в нём.
0
dzrkot
zzzZZZ...
523 / 353 / 54
Регистрация: 11.09.2013
Сообщений: 2,036
06.02.2014, 12:32 #15
Цитата Сообщение от [WRG] Посмотреть сообщение
зато код структирированный и понятный, тоже самое без ооп у меня какая-то лапша получалась, даже терялся в нём.
Цитата Сообщение от ValeryS Посмотреть сообщение
Я бы хотел запустить в классе датчика, т.е. foo, метод, который будет в цикле считывать показания с датчика, и если они превысят некий порог, надо дернуть соответствующий метод у прибора (bar). Вот это я имел в виду.
напишите функцию опроса датчика, напишите в обработчике прерываний по таймеру эту функцию, ну и соответственно бит порога этого дачика, потом в switch или по if дегайте чем хотите) это будет намного лучше
0
06.02.2014, 12:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.02.2014, 12:32
Привет! Вот еще темы с ответами:

Как в методе класса вызвать другой метод того же класса? - C++
class mate { public: int AplusB(int A, int B) { return A+B; } int AplusBplusC(int A, int B, int C)

Как в классе А у объекта класса B вызвать метод класса B ? - C++
Есть Класс A и класс B . В классе B лежит объект типа ArrayList , назовём его arrayList, в этом же классе есть метод push() . Возможно ли в...

Как использовать явный конструктор родительского класса? - C++
Привет :) Вот код, строчка 43. Как использовать конструктор типа A(int), в классе C? Компилятор выдаёт ошибку (Error:...

Как правильно вызвать функцию с указателем на другую функцию как параметр - C++
Вот вариант: double f(double x) { ... } double k(double (*f)(double), double y) { ...


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

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

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