Łukasz C.

Łukasz C. Senior Technical
Architect

Temat: wskazniki do metod wirtualnych

Witam,

potrzebuje napisac prosta baze do programowania zdarzeniowego, ogolnie potrzebuje mechanizmu ktory umozliwia wiązanie dowolnej instancji jakiejs klasy z dowolna metoda wirtualna z tej lub z innej klasy. Po wyslaniu jakiegos zdarzenia do danej klasy zostanie wykonana odpowiednia metoda (ktora moze nalezec do zupelnie innej klasy).

Problem jest w tym, ze jezeli metoda wirtualna nalezy do tej samej klasy musze ja wykonac w ten sposob: this->*wskaznik() natomiast jezeli nalezy do innej klasy to: sender.*wskaznik()

pytanie czy jest jakis w miare prosty sposob ktory umozliwial by podpiecie dowolnej metody pod dowolny obiekt za pomoca jednej funkcji lub makra?

poki co jedyne co mi przychodzi do glowy to stworzenie czegos w rodzaju uchwytu funkcji wirtualnej ktory skladal by sie z wskaznika do niej oraz wskaznika do obiektu do ktorego ona nalezy :S

ideowy kod:

class Application
{
int main()
{
Button b1, b2;

b1.bind(SOME_EVENT, onAction1);
b2.bind(SOME_EVENT, onAction2);
}

virtual void onAction1(Object& o, Event& e)
{
// jakas akcja
}

virtual void onAction2(Object& o, Event& e)
{
// jakas akcja 2
}
};
Tomasz Kaczanowski

Tomasz Kaczanowski Ot, programista

Temat: wskazniki do metod wirtualnych

Łukasz Cepowski:
Witam,

potrzebuje napisac prosta baze do programowania zdarzeniowego, ogolnie potrzebuje mechanizmu ktory umozliwia wiązanie dowolnej instancji jakiejs klasy z dowolna metoda wirtualna z tej lub z innej klasy. Po wyslaniu jakiegos zdarzenia do danej klasy zostanie wykonana odpowiednia metoda (ktora moze nalezec do zupelnie innej klasy).

Problem jest w tym, ze jezeli metoda wirtualna nalezy do tej samej klasy musze ja wykonac w ten sposob: this->*wskaznik() natomiast jezeli nalezy do innej klasy to: sender.*wskaznik()

pytanie czy jest jakis w miare prosty sposob ktory umozliwial by podpiecie dowolnej metody pod dowolny obiekt za pomoca jednej funkcji lub makra?

Możesz zapamiętać wskaźnik na metodę, tylko musisz to zrobić po wykonaniu się konstruktora.
Marek Dąbek

Marek Dąbek Software Engineer,
Intel Technology
Poland

Temat: wskazniki do metod wirtualnych

Łukasz Cepowski:
Witam,

potrzebuje napisac prosta baze do programowania zdarzeniowego, ogolnie potrzebuje mechanizmu ktory umozliwia wiązanie dowolnej instancji jakiejs klasy z dowolna metoda wirtualna z tej lub z innej klasy. Po wyslaniu jakiegos zdarzenia do danej klasy zostanie wykonana odpowiednia metoda (ktora moze nalezec do zupelnie innej klasy).
1. Czy "z lub innej" klasy oznacza, że chcesz wywoływać tylko z jednej klasy na raz?
2. Czy nie możesz zastosować wzorców projektowych Command + Observer?

konto usunięte

Temat: wskazniki do metod wirtualnych

Zobacz może boost::bind.

Coś więcej tutaj:
http://www.ddj.com/cpp/184401872
Piotr T.

Piotr T. programista GIS,
analityk GIS,
(www.cgis.pl)

Temat: wskazniki do metod wirtualnych

sprawdz:

boost::bind
boost::lambda
boost::signals
Jakub L.

Jakub L. Programista

Temat: wskazniki do metod wirtualnych

Słabo widzę zasadność i ideę, ale może obiekty funkcyjne - w konstruktorze podajesz obiekt na którym ma zostać wywołana metoda i samą metodę, a potem wołasz to w operatorze () ?
Pozostaje kwestia otypowania tego wszystkiego.
Szymon Kubisiak

Szymon Kubisiak Developer aplikacji
mobilnych Android

Temat: wskazniki do metod wirtualnych

Łukasz Cepowski:
pytanie czy jest jakis w miare prosty sposob ktory umozliwial by podpiecie dowolnej metody pod dowolny obiekt

Uhm, może po prostu wskaźnik na (zwykłą)funkcję? Po co pchać do jednej klasy coś co będzie wołane z innej?

Virtual jest metodą zmuszenia kompilatora do przechowywania wskaźników do funcji za Ciebie. Jeśli chcesz sam to robić ręcznie, używanie virtual tyklko wygeneruje ekstra tablicę której nie użyjesz. W kodzie jaki wkleiłeś onAction powinne być globalami.
Marcin Bońka

Marcin Bońka Programista, Neubloc
Polska Sp. z o.o.

Temat: wskazniki do metod wirtualnych

Witam,

Zgadzam sie z przedmowcami, takie rozwiazanie jest cokolwiek dziwne i rowniez nie do konca rozumiem, dlaczego starasz sie obejsc funkcjonalnosc jezyka jaka sa wirtualne funkcje. Wlasnie po to one sa, zeby nie musiec robic takich hakow. Osobiscie wydaje mi sie, ze jesli musisz robic takie konstrukcje, to znaczy, ze jest cos nie tak z kodem i nalezy go przepisac.

Ale zeby nie bylo, proponuje przeanalizowac ponizszy kod (jezeli bardzo lubisz pisac wszystko sam):


#include <iostream>

template <typename __T>
class callback {
private:
__T * m_object;
void (__T::* m_proc)();

public:
callback() { }
~callback() { }

void bind(__T * __object, void (__T::* __proc)()) {
m_object = __object;
m_proc = __proc;
}

void execute() {
(m_object->*m_proc)();
}
};

class test {
public:
virtual ~test() { }

virtual void function() {
std::cout << "Test" << std::endl;
}
};

int main() {
callback<test> c;
test t1;

c.bind(& t1, & test::function);
c.execute();
return 0;
}


Jesli jednak wolisz zadowolic sie istniejacymi rozwiazaniami, to moze jednak biblioteka boost...
Szymon Kubisiak

Szymon Kubisiak Developer aplikacji
mobilnych Android

Temat: wskazniki do metod wirtualnych

Jednak C++ nie ma dynamicznie typowanych obiektów i konstruowania w locie zlepków z różnych klas, więc jeśli ma np 10 różych eventów i 10 różnych reakcji, to ręczne przekładanie wskaźników może być sensowniejsze niż predefiniowanie 100 klas.
A zmienne w locie to już w ogóle.

Marcinie, nie bardzo kumam po co function() jest wirtualna : )
Marcin Bońka

Marcin Bońka Programista, Neubloc
Polska Sp. z o.o.

Temat: wskazniki do metod wirtualnych

Dalej uwazam, ze jezeli trzeba robic podobne rozwiazania, to nalezy sie przyjrzec kodom zrodlowym i pomyslec, czy aby na pewno nie da sie tego napisac inaczej (prosciej ?).

Co do virtualnej funkcji, zasugerowalem sie kodem oryginalnym z postu Łukasza:


...
virtual void onAction1(Object& o, Event& e)
...


...to wszystko.

konto usunięte

Temat: wskazniki do metod wirtualnych

Szymon Kubisiak:
Jednak C++ nie ma dynamicznie typowanych obiektów i konstruowania w locie zlepków z różnych klas, więc jeśli ma np 10 różych eventów i 10 różnych reakcji, to ręczne przekładanie wskaźników może być sensowniejsze niż predefiniowanie 100 klas.
A zmienne w locie to już w ogóle.

Marcinie, nie bardzo kumam po co function() jest wirtualna : )

Oj czepiasz sie. Może po prostu ma zrobić nowy framework do GUI?
Coś jak wxWidgets tylko prostsze?

Łukasz, jeśli masz możliwość, to zrezygnuj z tego projektu, na prawdę są ciekawsze wyzwania.

Bo jak na mój gust to trochę z tym roboty będzie...
Łukasz C.

Łukasz C. Senior Technical
Architect

Temat: wskazniki do metod wirtualnych

Piotr Likus:
Oj czepiasz sie. Może po prostu ma zrobić nowy framework do GUI?
Coś jak wxWidgets tylko prostsze?

Łukasz, jeśli masz możliwość, to zrezygnuj z tego projektu, na prawdę są ciekawsze wyzwania.
No mam poprostu ochote pobawic sie troche z golym xlibem :)

Bo jak na mój gust to trochę z tym roboty będzie...
i tak i nie, z tego co ogladalem kod blendera jego niby gui nie jest az takie znowu wielkie :P

Następna dyskusja:

Szkolenia z metod komputero...




Wyślij zaproszenie do