override w C++, i nie tylko

2009-10-13 19:13

O braku słowa kluczowego override w C++ zdarzyło mi się już wspominać. Wskazywałem też, że jego niedobór jest całkiem istotnym brakiem, gdyż przypadki nadpisywania metod wirtualnych nie zawsze są zupełnie oczywiste.
Tym bardziej jest mi miło podzielić się odkryciem, które kiedyś poczyniłem na forum Warsztatu. Dowiedziałem się mianowicie, że słówko to do C++ można… dodać!

Jak to? – słychać pewnie pełne zdziwienia głosy. Ano bardzo prosto; zostało to zresztą wyczerpująco przedstawione w oryginalnym poście Esidara. Tutaj pokrótce tylko nakreślę jego ideę, która sprowadza się do genialnego spostrzeżenia, iż C++ zasadniczo radzi sobie bez override. A skoro tak, to jego wprowadzenie jest banalnie i wymaga zaledwie jednej linijki kodu:

  1. #define override

I już! Składniowo można go teraz używać dokładnie tak samo jak analogicznego słówka z C#… albo właściwie jakkolwiek inaczej – implementacja jest bowiem na tyle elastyczna, że zaakceptuje każde jego wystąpienie :) To aczkolwiek jest też, niestety, jego wadą…

W porządku, żarty na bok. Żeby ta notka nie była jednak zupełnie bezużyteczna, pokażę jeszcze, jak przekonać Visual C++, by nasze nowe słówko było przezeń kolorowane tak, jak inne słowa kluczowe w C++.
Da się to zrobić, tworząc (lub edytujący istniejący) plik UserType.dat, umieszczony w tym samym katalogu co plik wykonywalny Visual Studio (devenv) – czyli gdzieś w czeluściach Program Files, zapewne. W tymże pliku wpisujemy w nowej linijce override. Jeśli przypadkiem chcielibyśmy kolorować też inne, niestandardowe słowa kluczowe (to pewnie jest bardziej prawdopodobne), to każde z nich należy umieścić w osobnej linijce.
Po zapisaniu pliku i restarcie VS wystarczy teraz wejść w opcje programu, do zakładki Environment > Fonts & Colors, a tam na liście Display items zaznaczyć User Keywords i przyporządkować im wybraną czcionkę i/lub kolor. Możliwe zresztą, że w ogóle nie musimy tego robić, jako że domyślnie własne słowa kluczowe kolorowane są tak, jak te “oryginalne”.

Be Sociable, Share!
Be Sociable, Share!


6 comments for post “override w C++, i nie tylko”.
  1. Kot:
    October 13th, 2009 o 19:37

    W ten sposób w pięknym stylu WYŁĄCZASZ rozszerzenie MSVC zapewniające właśnie sprawdzanie override’owania :).

    W Visualu możesz napisać:

    1. class Base
    2. {
    3. public:
    4.     virtual void g()
    5.     {}
    6. };
    7.  
    8. class Derived : public Base
    9. {
    10. public:
    11.     virtual void f() override
    12.     {}
    13. };

    co ci sypnie pięknym błędem:
    error C3668: ‘Derived::f’ : method with override specifier ‘override’ did not override any base class methods

    Rozwiązanie, które zapewni przenośność, pełne sprawdzanie w MSVC i poszlaki (czyli to co sugerujesz Ty) na innym kompilatorach to prosta definicja:

    1. #ifdef MSVC
    2. #    define OVERRIDE override
    3. #else
    4. #    define OVERRIDE
    5. #endif

    :)

  2. Xion:
    October 13th, 2009 o 21:11

    Raczej:

    1. #ifndef MSVC
    2. #define override
    3. #endif

    bo skoro coś takiego rzeczywiście w VC jest (dlaczego, do cholery, dopiero teraz się o tym dowiaduję?!), to czemu niby jeszcze należałoby to CAPS-ować? :)

  3. Kot:
    October 13th, 2009 o 21:28

    True, w Twoim przypadku oczywiście lepiej tak. Ja mam capsowane, bo taką mam konwencję przy wszystkich makrach :).

    I dziękuję za formatowanie :)

    A odnośnie innych ciekawych intrinsiców, warto przeczytać o __assume :)
    http://msdn.microsoft.com/en-us/library/1b3fsfxw.aspx

  4. krajek:
    October 13th, 2009 o 22:33

    No nie, czemu nikt o tym override w visualu nie krzyczał ;-) ! Xion, chyba wypadało by uaktualnić samą notkę, bo teraz komentarz Kota ma większą wartość merytoryczną, a do komentarzy nie każdy zagląda.
    (A widać na tym przykładzie jasno, że warto ;-) )

  5. Kot:
    October 13th, 2009 o 22:40

    Dla potomnych wkleiłem do topica, który Xion linkował w notce. Jakbym wiedział, że tego nie znacie to bym pisał wcześniej :).

  6. Aithne:
    October 13th, 2009 o 22:53

    Ciekawe rozszerzenie…

    Następnym razem może coś o specyfikacjach wyjątków w Visualu?

Comments are disabled.
 


© 2023 Karol Kuczmarski "Xion". Layout by Urszulka. Powered by WordPress with QuickLaTeX.com.