Thread View: pl.comp.lang.c
15 messages
15 total messages
Started by Borneq
Mon, 06 Feb 2017 10:53
Jak sprawdzić jakiej klasy jest obiekt (wskaźnik) ?
Author: Borneq
Date: Mon, 06 Feb 2017 10:53
Date: Mon, 06 Feb 2017 10:53
9 lines
1403 bytes
1403 bytes
W Pascalu to było "is". Uczę się teraz wxWidgets. Lista z kolumnami to wxListView:wxListCtrl a niestandardowa z checkboxami to wxCheckedListCtrl:wxListCtrl. Mam jedną funkcję do wypełniania obu typów wołając InsertItem. Ale samo wypełnienie nawet dobrze działa, tylko potem dla listy z checkboxami jest źle gdy są eventy klikania na niej. Dlatego że prawdopodobnie InsertItem nie jest wirtualna. Więc chciałbym sprawdzić obiekt list, czy jest wxListView czy wxCheckedListCtrl i specjalnie wywołać InsertItem.
Re: Jak sprawdzić jakiej klasy jest obiekt (wskaźnik) ?
Author: Borneq
Date: Mon, 06 Feb 2017 12:45
Date: Mon, 06 Feb 2017 12:45
10 lines
1283 bytes
1283 bytes
W dniu 06.02.2017 o 11:53, Borneq pisze:
> Więc chciałbym sprawdzić obiekt list, czy jest wxListView czy
> wxCheckedListCtrl i specjalnie wywołać InsertItem.
http://stackoverflow.com/questions/15898121/how-to-determine-actual-object-type-at-runtime-in-c
jest
if (dynamic_cast<Derived*>(b)) { ... }
więcej, to można użyć <typeinfo> i pobrać typeid(*b).name()
Re: Jak sprawdzić jakiej klasy jest obiekt (wskaźnik) ?
Author: slawek
Date: Sun, 12 Feb 2017 09:42
Date: Sun, 12 Feb 2017 09:42
15 lines
1733 bytes
1733 bytes
On Mon, 6 Feb 2017 11:53:10 +0100, Borneq <borneq@antyspam.hidden.pl> wrote: > W Pascalu to było "is". Nie. Nie było. Pascal nie jest językiem obiektowym. Obiektowe są Object Pascal i Delphi. > Więc chciałbym sprawdzić obiekt list, czy jest wxListView czy > wxCheckedListCtrl i specjalnie wywołać InsertItem. Trywialnie: rzutujesz przez dynamic_cast. Jeżeli dostaniesz nullptr to oznacza że nie jest. Patrz też RTTI. Lepiej jednak popracować: zrobić dwie podklasy, każdą z odpowiednim wariantem InsertItem. Wtedy nie trzeba nic sprawdzać. Po to jest OOP.
Re: Jak sprawdzić jakiej klasy jest obiekt (wskaźnik) ?
Author: Przemek Biernat
Date: Sat, 22 Apr 2017 06:39
Date: Sat, 22 Apr 2017 06:39
1 lines
1425 bytes
1425 bytes
Nie castuj zrób enum i metode virtualną type() która zwróci odpowiedni enum w klasach potomnych
Re: Jak sprawdzić jakiej klasy jest obiekt (wskaźnik) ?
Author: bartekltg
Date: Sat, 22 Apr 2017 09:13
Date: Sat, 22 Apr 2017 09:13
8 lines
1375 bytes
1375 bytes
On 22.04.2017 08:39, Przemek Biernat wrote: > Nie castuj zrób enum i metode virtualną type() która zwróci odpowiedni enum w klasach potomnych > A typeid nie zadziała? Obciążenie chyba takie samo, ale mniej pisania. pzdr bartekltg
Re: Jak sprawdzić jakiej klasy jest obiekt (wskaźnik) ?
Author: Przemek Biernat
Date: Sat, 22 Apr 2017 17:38
Date: Sat, 22 Apr 2017 17:38
1 lines
1636 bytes
1636 bytes
No dobra przyjmijmy że wydajność jest podobna choć nie mam pewności to jak tym sposobem sprawdzisz że obiekt obj jest klasy c2 i gdzie c1 dziedziczy po c1
Re: Jak sprawdzić jakiej klasy jest obiekt (wskaźnik) ?
Author: bartekltg
Date: Sat, 22 Apr 2017 18:47
Date: Sat, 22 Apr 2017 18:47
53 lines
2104 bytes
2104 bytes
On 22.04.2017 19:38, Przemek Biernat wrote:
> No dobra przyjmijmy że wydajność jest podobna choć nie mam pewności to jak tym sposobem sprawdzisz że obiekt obj jest klasy c2 i gdzie c1 dziedziczy po c1
Jeśli jest tam poliformizm, to rozróżnia.
Albo czegoś nie rozumiem;]
#include <iostream>
#include <vector>
#include <typeinfo>
class foo{
protected:
vector<int> data;
public:
foo() {data.push_back(0);data.push_back(1);}
virtual int bla() { return data.back(); }
};
class bar: public foo
{public:
bar() : foo() {}
int bla() { return data.front();}
};
void check( foo * ptr ){
cout<< typeid(*ptr).name()<<endl;
cout<< ptr->bla()<<endl;
}
int main(int argc, char *argv[]){
foo * ptr = new foo();
check( ptr );
delete ptr;
ptr = new bar();
check( ptr );
return 0;
}
Zwraca
3foo
1
3bar
0
pzdr
bartekltg
Re: Jak sprawdzić jakiej klasy jest obiekt (wskaźnik) ?
Author: Przemek Biernat
Date: Sun, 23 Apr 2017 09:53
Date: Sun, 23 Apr 2017 09:53
1 lines
2067 bytes
2067 bytes
Może to nie jest taki zły pomysł tym bardziej że typeid zwraca referencję do struktury, ale żeby sprawdzić czy obiekt jest danego typu trzeba porównać dwa stringi co jest mniej wydajne od porównania dwóch intów z rozwiązania przy enum. Typeid ma też id tylko teraz skąd mam wiedzieć jakie id ma klasa którą chce sprawdzić kiedy klas jest kilkadziesiąt.
Re: Jak sprawdzić jakiej klasy jest obiekt (wskaźnik) ?
Author: bartekltg
Date: Sun, 23 Apr 2017 12:03
Date: Sun, 23 Apr 2017 12:03
31 lines
2482 bytes
2482 bytes
On 23.04.2017 11:53, Przemek Biernat wrote: > Może to nie jest taki zły pomysł tym bardziej że typeid zwraca > referencję do struktury, ale żeby sprawdzić czy obiekt jest danego > typu trzeba porównać dwa stringi co jest mniej wydajne od porównania > dwóch intów z rozwiązania przy enum. Typeid ma też id tylko teraz > skąd mam wiedzieć jakie id ma klasa którą chce sprawdzić kiedy klas > jest kilkadziesiąt. Nie, nie stringi! type_index od wyniku typeid. Wygenerować sobie słownik tepeid-> to, co mnie interesuje dla tego zbioru? A choćby tak: http://en.cppreference.com/w/cpp/types/type_index Tylko mapa nie musi być do stringa, a do tego, co jest naprawdę potrzebne. Nawet wskaźnik do spacjalizowanej funkcji. Niby upierdliwe, ale pilnowanie, by enum i te kilkadziesiat klas działało dobrze, też wymaga pewnej staranności, zwłąszcza, jak drzewko dziedzizenia nie jest dwupietrowe. Z drugiej strony, którejkolweik metody bym nie użył, jeśli miałbym w kodzie miejsca, gdzie gostaje wskaźnik do klasy bazowej i muszę wiedzieć, na którą dokładnie klasę włąśnie pokazuję, uznałbym, zę jednak mogłęm to zaprojektować lepiej:) pzdr bartekltg
Re: Jak sprawdzić jakiej klasy jest obiekt (wskaźnik) ?
Author: bartekltg
Date: Sun, 23 Apr 2017 12:10
Date: Sun, 23 Apr 2017 12:10
29 lines
2038 bytes
2038 bytes
On 06.02.2017 11:53, Borneq wrote: > W Pascalu to było "is". > Uczę się teraz wxWidgets. Lista z kolumnami to wxListView:wxListCtrl a > niestandardowa z checkboxami to wxCheckedListCtrl:wxListCtrl. > Mam jedną funkcję do wypełniania obu typów wołając InsertItem. Ale samo > wypełnienie nawet dobrze działa, tylko potem dla listy z checkboxami > jest źle gdy są eventy klikania na niej. Dlatego że prawdopodobnie > InsertItem nie jest wirtualna. > Więc chciałbym sprawdzić obiekt list, czy jest wxListView czy > wxCheckedListCtrl i specjalnie wywołać InsertItem. A przeczytaj sobie, jakie metody daje wx_object, wszytko jest gotowe. http://docs.wxwidgets.org/trunk/classwx_object.html Chyba wszytko jhest tam pochodna tego. virtual wxClassInfo * GetClassInfo () const This virtual function is redefined for every class that requires run-time type information, when using the wxDECLARE_CLASS macro (or similar) bool IsKindOf (const wxClassInfo *info) const Determines whether this class is a subclass of (or the same class as) the given class pzdr bartekltg
Re: Jak sprawdzić jakiej klasy jest obiekt (wskaźnik) ?
Author: Przemek Biernat
Date: Sun, 23 Apr 2017 14:03
Date: Sun, 23 Apr 2017 14:03
1 lines
2034 bytes
2034 bytes
Przez uproszczenie const char * nazywam stringiem, jestem pewien prawie na 100% że jest to wolniejsze ale skoro gui to może nie ma znaczenia. Najlepiej byłoby zrobić mape z enumami gdzie value to wskaźnik na obiekt funkcyjny, rozumiem że tak funkcyjny/miałby renderować wyświetlać. Po enumie dostajesz funktor który renderuje obiekt. Tą mape opokowujesz w klase fabryka i jest. Ale faktycznie jak jest dużo klas to enum jest duży.
Re: Jak sprawdzić jakiej klasy jest obiekt (wskaźnik) ?
Author: Przemek Biernat
Date: Sun, 23 Apr 2017 14:15
Date: Sun, 23 Apr 2017 14:15
1 lines
1903 bytes
1903 bytes
A i zapomniałem metoda type() powinna być implementowana tylko w klasach liściach co upraszcza zarządzanie chociaż by ze wzglęu na wsparcie kompilatora
Re: Jak sprawdzić jakiej klasy jest obiekt (wskaźnik) ?
Author: bartekltg
Date: Sun, 23 Apr 2017 14:48
Date: Sun, 23 Apr 2017 14:48
43 lines
2787 bytes
2787 bytes
On 23.04.2017 16:03, Przemek Biernat wrote: > Przez uproszczenie const char * nazywam stringiem, jestem pewien > prawie na 100% że jest to wolniejsze ale skoro gui to może nie ma > znaczenia. Trochę się poszpieszyłęm. Myślałem, że mówisz o tym .name() Chodziło mi o to, że w tamtym kodzie uzyłęm metody name z klasy typename, bo tak było szybciej. Do porównywania w kodzie lepiej użyć albo metody hash_code (ale mogą być konflikty i wylądujemy w ciemnym miejscu) albo, najelpiej funkcji type_index. piszę type_index(typeid(*ptr)) i mam unikalny size_t. Ale rzeczywisćie, przynajmniej w gcc, tam w kod zerknąłem, type_info to opakowanie na łancuch, więc dość obciążające w porównaniu do Twojego rozwiązania. > Najlepiej byłoby zrobić mape z enumami gdzie value to wskaźnik na > obiekt funkcyjny, rozumiem że tak funkcyjny/miałby renderować > wyświetlać. Po enumie dostajesz funktor który renderuje obiekt. W takim wypadku nie wystarczy virtualna funkcja na gorze hierarchii? > Tą mape opokowujesz w klase fabryka i jest. Ale faktycznie jak jest > dużo klas to enum jest duży. > A i zapomniałem metoda type() powinna być implementowana tylko w > klasach liściach co O ile wszytkie okiekty, których używasz, są typami z lisci hierarhii. > upraszcza zarządzanie chociaż by ze wzglęu na > wsparcie kompilatora Dlaczego? pzdr bartekltg
Re: Jak sprawdzić jakiej klasy jest obiekt (wskaźnik) ?
Author: Przemek Biernat
Date: Sun, 23 Apr 2017 16:34
Date: Sun, 23 Apr 2017 16:34
3 lines
2342 bytes
2342 bytes
Ad 1. Moze byc funkcja trzeba tylko przekazać pointer na kontekst renderujący. Ad1,2. type() powinno byc funkcją czysto wirtualna a implementacje powinny być w klasach obiektów kompilator powie o nieprawidłowy ibstanchach klas o takim wsparciu pomyślałem w przeciwieństwie do zwykłej funkcji wirualnej której werjsa niewiafomo która zostanie wykonana (wiadomo ale trzeba pomyśleć) Zwykle stosuje tajtykę że type() implementuje w klasach które nie dzielą się na kolejne pod typy.
Re: Jak sprawdzić jakiej klasy jest obiekt (wskaźnik) ?
Author: Przemek Biernat
Date: Sun, 23 Apr 2017 16:42
Date: Sun, 23 Apr 2017 16:42
1 lines
2043 bytes
2043 bytes
To rozwiązanie nie jest do końca moje, chociaż go używam, jakieś pietnaście lat, może mniej, temu, ktoś mi podpowiedział o takim prostym ale fajnym triku.
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads