Aktywne Wpisy

mickpl +287
Nowy minister od mieszkalnictwa z ramienia lewicy może sporo namieszać XD Zamiast kredytów 0% chce katastru i podatku od pustostanów.
#nieruchomosci #ekonomia #gospodarka #polityka
#nieruchomosci #ekonomia #gospodarka #polityka
źródło: kukucki
Pobierz
Ytarka +640
źródło: Zdjęcie z biblioteki
Pobierz




Zastanawiałem się kiedyś, czy można jakoś automatycznie wyciągać typ po którym dziedziczymy w c++, coś w stylu
super, nic na ten temat nie znalazłem ciekawego. W jakimś wątku na SO twierdzili nawet, że to niemożliwe. Potrzebuję to, żeby uniknąć błędów przy wywoływaniu metod z bazy z overridowanych metod virtualnych w aktualnej klasie.
Wczoraj kolega z pracy wymyślił taki trik, że w klasie bazowej robimy sobie typdefa (nie using, bo jesteśmy akurat ograniczeni do cpp03), którego weźmie do zdefiniowania
Inheritedw klasie dziedziczącej i potem przedefiniuje aktualny typ, itd. w kolejnych.
Pokażę od razu kod: http://ideone.com/1WOXcc
Działa na gcc, clangu i vc, ale nie jestem na 100% pewny, czy jest zgodny ze standardem.
W 7.1.2
Wg mnie jest OK, bo redefiniujemy typedef z innego scope'a, mam rację?
Wołam @KrzaQ2
Ciekawi mnie raczej, jakich błędów chcesz się ustrzec korzystając z tego mechanizmu?
Załóżmy, ze masz jakąś klasę bazową Object, po której dziedziczy cała masa innych, np. Node, Node2D, jakieś inne GuiObject, które wszystkie mają virtualną metodę onLoaded. I teraz jeżeli robimy na nią override, to chcielibysmy wewnatrz jej wywołać też metodę bardziej bazową, a następnie naszą logikę. W
Zamiast tego odwróć sytuację. Klasa bazowa będzie mieć niewirutalną metodę "OnLoaded" która woła w odpowiednim momencie wirtualną metodę "protected: void doLoading()".
Generalnie przy dziedziczeniu to klasa bazowa powinna ustalać reguły, które dziedziczona ma tylko wykonać - tzn. to klasa bazowa
Ja zawsze w takich przypadkach uƶywam aliasu 'parent', ale to z reguły jest w szablonach klas, gdzie wystarczy wyciągnąć jeden z parametrów szablonu.
A drugie moje zastosowanie to coś w stylu RTTI, takie obiekty z komponentami, w których możesz eksportować niektóre membery, np. do synchronizacji, zew. narzędzi itp. Coś takiego jest w Chrome engine, o ile dobrze pamiętam. W takim wypadku też musisz mieć możliwość dobrania się tylko do komponentów swoich i dokładnie 1 poziom niżej.
@KrzaQ2: tylko moje pytanie było zasadniczo o poprawność wrzuconego kodu...
A clang sam w sobie odpada, ze względu na specyficzny target.
Sorry, dopiero się obudziłem ;)
Btw: zacytowałeś kawałek dotyczący "non-class scope", a przykład wyraźnie jest wewnątrz klasy
__super: http://msdn.microsoft.com/en-us/library/94dw1w7x.aspx
Wydaje mi się że taki mechanizm jest ok - jeśli działa na clang'u, gcc i vc, to w zasadzie nie ma o czym mówić ; ).
Standard C++ ma multum zakamarków, o których nie wie nawet Stroustrup - zamiast zająć się porządkowaniem języka, komisja standaryzacyjna rozpływa się w ezoteryce : >..
Ale to taka sztuka dla sztuki, bo problemów generuje dużo więcej, niż korzyści,
Jeśli masz stałą listę klas bazowych, może "przeładuj" za pomocą tag dispatchowania i isbaseof dla nich?