Как вызвать функцию из другого класса в c
Перейти к содержимому

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

  • автор:

Как из метода класса вызвать метод другого класса, когда оба внутри третьего класса?

Или я просто не вкурил, как вызвать вышележащий namespace. Или я делаю нечто нехорошее, за что бьют канделябром.

Зачем мне это нужно: в программе леплю класс, абстрагирующий от остального кода GUI. Внутри него должно крутится все связанное с *graphical toolkit name*. Два окна, два класса. В одном прилетает callback, оно себя закрывает и должно вызывать show для другого окна.

Gregon ★
02.12.12 16:33:12 MSK

1) передай в B инстанс a параметром. Я за этот вариант.

2) сделай глобальную переменную a (см. оператор global).

PS Кстати, перменные глобальны только в пределах одного модуля.

true_admin ★★★★★
( 02.12.12 16:42:22 MSK )
Ответ на: комментарий от true_admin 02.12.12 16:42:22 MSK

Сделал передачу инстанса в __init__(), заработало, спасибо.

Другие варианты как подобные вещи разруливать существуют? Имхо, если есть сотня окон то начинается трэш и угар: они создаются и уничтожаются. Придется создавать список и регулярно обновлять его. Выглядит как костыль. А глобальные переменные всегда предавались анафеме)

Gregon ★
( 02.12.12 16:54:30 MSK ) автор топика
Ответ на: комментарий от Gregon 02.12.12 16:54:30 MSK

я не понимаю что ты хочешь сделать, но раз прилетает callback то пусть прилетает вместе с инстансом для которого надо вызвать callback.

А список с регулярными обновлениями делается просто, посмотри weakref модуль. Дальше в __init__ просто в этот контейнер запихиваешь self.

import weakref container = weakref.weakSet() class Test: def __init__(self): container.add(self) 

true_admin ★★★★★
( 02.12.12 17:02:10 MSK )

Может тебя так устроит?

class A(object): def func(self): print "it works" class B(object): def func2(self, ns): ns.a.func() class C(object): def __init__(self): self.a = A() self.b = B() self.b.func2(self) if __name__ == '__main__': c = C() 

k0valenk0_igor ★★★
( 02.12.12 17:07:31 MSK )
Ответ на: комментарий от true_admin 02.12.12 17:02:10 MSK

Callback прилетает после нажатия кнопки в визарде первой настройки, с ним прилетает исключительно инфа «закрой окно, я закончил».

Gregon ★
( 02.12.12 17:15:18 MSK ) автор топика
Ответ на: комментарий от Gregon 02.12.12 17:15:18 MSK

я думаю ты что-то не то делаешь. Я надеюсь ты не пытаешься написать абстрактную обёртку для любого *graphical toolkit name*?

true_admin ★★★★★
( 02.12.12 17:17:25 MSK )
Ответ на: комментарий от k0valenk0_igor 02.12.12 17:07:31 MSK

Отлично, так тоже работает и теперь у меня есть доступ к неймспейсу суперкласса, большое спасибо.

Gregon ★
( 02.12.12 17:20:31 MSK ) автор топика

class A(object): def func(self): print "it works" class B(object): def func2(self): self.a.func() class C(object): def __init__(self): a = A() b = B() b.a = a b.func2() if __name__ == '__main__': c = C() 

k0valenk0_igor ★★★
( 02.12.12 17:21:15 MSK )
Ответ на: комментарий от Gregon 02.12.12 17:20:31 MSK

Да не за что. Удачи, коллега!)))

k0valenk0_igor ★★★
( 02.12.12 17:22:09 MSK )
Ответ на: комментарий от Gregon 02.12.12 17:20:31 MSK

теперь у меня есть доступ к неймспейсу суперкласса

Что ты называешь «суперклассом»?

tailgunner ★★★★★
( 02.12.12 17:22:18 MSK )
Ответ на: комментарий от true_admin 02.12.12 17:17:25 MSK

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

Gregon ★
( 02.12.12 17:22:59 MSK ) автор топика
Ответ на: комментарий от tailgunner 02.12.12 17:22:18 MSK

В данном случае экземпляр (объект) класса, в котором находится внутри несколько других объектов.

Gregon ★
( 02.12.12 17:26:39 MSK ) автор топика

Как из метода класса вызвать метод другого класса, когда оба внутри третьего класса?

как минимум так:

class A(object): def func(self): print "it works" class B(object): def func2(self, a): a.func() class C(object): def __init__(self): a = A() b = B() b.func2(a) if __name__ == '__main__': c = C() 

AGUtilities ★★★
( 02.12.12 17:26:51 MSK )
Ответ на: комментарий от Gregon 02.12.12 17:22:59 MSK

я просто хочу завернуть всю требуху в один класс с определенным интерфейсом, чтобы в случае перехода на другой тулкит не пришлось переписывать код в самых неожиданных местах.

я так и думал. Забей на это потому что:

1) не справишься

2) это бессмысленная задача, 99% времени всё равно будешь сидеть либо на qt, либо на gtk

4) делать абстрактный универсальный код «на все случаи жизни» это классическая ошибка программистов. Протрахаешься неделю/месяц и забьёшь, а результата не получишь

5) даже если сделаешь костыль он будет страшен потому что тулкиты между собой отличаются не только именами функций, но ещё архитектурой. Поэтому у тебя будет, по-сути, написаны очень разные обёртки с одним API. Так сделай сразу как надо: разбей свою программу на низкоуровневую библиотеку и к ней напиши несколько интерфейсов.

Короче, потрать время с большей пользой.

true_admin ★★★★★
( 02.12.12 18:07:20 MSK )
Последнее исправление: true_admin 02.12.12 18:07:58 MSK (всего исправлений: 1)

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

Пользователь

Регистрация: 28.03.2011

Сообщений: 32

Как вызвать функцию из класса ?

Есть класс, а в нем функция

class test < public: int sh(); >; sh()

А как теперь его вызвать ?

test::sh();

не прокатывает, вылазит ошибка

Use . or -> to call ‘test::sh()

, однако при попытке test.sh(); или test->sh(); тоже не компилируется

Silly Student
Посмотреть профиль
Найти ещё сообщения от Silly Student

Форумчанин

Регистрация: 07.08.2011

Сообщений: 576

вот так попробуй

int test::ch() < //тут тело метода >

Пользователь

Регистрация: 25.05.2011

Сообщений: 89

class test < public: int sh(); >; int test::sh() < ShowMessage("sh"); return 0; >void main()

Последний раз редактировалось _Alerter_; 13.10.2011 в 20:09 .

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вызвать функцию из функции ? PheonixS JavaScript, Ajax 3 16.12.2010 05:35
Как вызвать функцию из юнита? Des Общие вопросы Delphi 5 06.11.2010 12:47
Вызвать функцию с известной сигнатурой для неизвестного класса. Интерфейс Ferrum26 Общие вопросы Delphi 4 22.07.2010 14:26
Как вызвать метод из другого класса в C# KobolD Помощь студентам 6 25.06.2010 14:12
Как вызвать функцию? blackstersl Общие вопросы Delphi 10 07.06.2009 19:22

Вызов функции одного класса внутри функции другого класса

Как передать функцию, возвращающую некоторую величину из одного класса в качестве переменной в функции, определенной в другом классе. На данный момент мой код выглядит примерно так:

float A::decay()< B b; float N; const int HL=946; const int G=126; float T; if(b.min()>0) < T=(float)(b.min()-G)/HL; N=pow(2,-T); >return N; > int B::min() < int min=dtim[0][0][0]; for(int i=0;i> > return min; > 

При попытке вызова функции min() в decay(), min всегда равен нулю.
Отслеживать
13.7k 12 12 золотых знаков 43 43 серебряных знака 75 75 бронзовых знаков
задан 14 июл 2016 в 11:56
11 1 1 серебряный знак 2 2 бронзовых знака
вам известно что такое указатель на функию ?
14 июл 2016 в 12:08
@ampawd не отказался бы от объяснения на примере данного кода
14 июл 2016 в 12:15

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

По указателю, очевидно.

Но проще передать указатель на класс, и уже оттуда вызвать нужный метод.

float A::decay(B * b)< // B b; - это больше не нужно . здесь без изменений if (b->min()>0)< . 

Отслеживать
ответ дан 14 июл 2016 в 12:13
Alexey Esaulenko Alexey Esaulenko
323 1 1 серебряный знак 12 12 бронзовых знаков

У вас проблема скорее в вычислении min , а не в передаче функции. Вернее, не в передаче, а вызове. Вы не делаете ничего сверхъестественного. Код ниже - упрощенная версия вашего. Но что такое у вас dtim , какие там значения и т.д. и т.п. - этого же мы не знаем! Потом, у вас в decay создается объект B конструктором по умолчанию - так и надо? Может, в этом b все элементы dtim - нулевые?

Другое дело, если вам действительно надо передать функцию-член одного класса в другую.

Отслеживать
ответ дан 14 июл 2016 в 12:12
218k 15 15 золотых знаков 117 117 серебряных знаков 229 229 бронзовых знаков
второй вариант, вычисляемые значения min верны, при вызове печати из класса B
14 июл 2016 в 12:14

@robado Знаете, приведите все же какой-то минимальный самодостаточный пример - ru.stackoverflow.com/help/mcve

Вызов метода другого класса

Вызов статического метода из другого класса
Добрый день. Есть MAIN.cpp: STDMETHODIMP CMAIN::Function1(VARIANT Data,BYTE* pBuff) < .

Передача метода класса в качестве параметра для метода другого класса
Здравствуйте, Передо мной стоит такая задача. Необходимо разработать механизм, который бы мог.

Вызов метода объекта внутри определения метода другого объекта(вложенные классы)
Как мне вызвать метод объекта slider класса Slider внутри определения метода объекта класса.

495 / 377 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
в данном примере никак

Эксперт С++

13663 / 10580 / 6322
Регистрация: 18.12.2011
Сообщений: 28,248

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
#include using namespace std; class A { public: void Show() { cout  "A"  endl; }; }; class B { public: void Sm() { A a; a.Show(); cout  "B"  endl; } }; int main() { B ob; ob.Sm(); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
#include using namespace std; class A { public: static void Show() { cout  "A"  endl; }; }; class B { public: void Sm() { A::Show(); cout  "B"  endl; } }; int main() { B ob; ob.Sm(); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
#include using namespace std; class A { public: void Show() { cout  "A"  endl; }; }; class B:public A { public: void Sm() { Show(); cout  "B"  endl; } }; int main() { B ob; ob.Sm(); return 0; }

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Вызов метода производного класса через обращение к методу базового класса
Добрый день. Изучаю основы ООП, наткнулся на проблему. Если создавать классы внутри main.cpp.

Вызов метода класса в лямбде-функции, вызываемой в другом методе этого же класса
Здравствуйте. Помогите грамотно передать в лямбду метод класса. Упрощенно. Есть класс. В одном.

Вызов метода в классе из другого
Не получается выполнить следующую цепочку действий. Запускаю метод в классе B через main, он.

Вызов метода класса без создания экземпляра класса.
В общем мне для функционирования одной программы нужно постоянно вызывать метод одного из классов.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *