[PL] Stara miłość nie umiera czy kotlet odgrzewany? Rzecz o C++


Heh.. w ten weekend się zebrałem aby przyjrzeć się co też najnowsze środowisko Visual Studio.Net 2008 zgotowało programistom C++.
Od razu powiem, że tak solidnie z 2 lata nic w C++ nie napisałem. Przeżyłem lekki szok. Abstrahując od samego środowiska, język trochę jak z epoki lodowcowej 🙂

Mam sentyment, po jakiejś chwili się rozkręciłem, ale quasi-obiektowy konstrukt, w którym przy stworzeniu okna, krew mnie zalewała, oczy bolały i ręce się trzęsły na sam fakt, że mam tam poza wszystkimi klasami dwie funkcje, które działają mi na nerwy: WinMain() oraz WindowProc(). Na szczęście ponownie sobie przypomniałem stary trick z reinterpret_cast'em aby wyeliminowac potrzebę WindowProc a WinMain sprowadziłem do roli makra wywoływanego przy mojej własnej interpretacji klasy Application.

Jak ktoś nie wie o czym piszę to zachęcam do spojrzenia na stary wpis na blogu Raymonda: http://blogs.msdn.com/oldnewthing/archive/2005/04/22/410773.aspx
Tam wyjasnione jest jak obejść WindowProc na modłę w pełni obiektową. W kwestii makra do WinMain'a to u mnie wygląda w ten sposób:


#define ApplicationStartup(SAFEMODE, APPCLASSNAME) \
    TheFramework::Application *_GlobalApp = 0; \
    int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { \
    _GlobalApp = (TheFramework::Application*)
new APPCLASSNAME(); \
    _GlobalApp->Init(hInstance,hPrevInstance,lpCmdLine, nShowCmd); \
    _GlobalApp->Run();
delete _GlobalApp; }

Dzięki temu, jak już sobie zrobię własną klasę właściwą dziedziczącą po Application to mój start programu wygląda tak:


---------------------------
#include
<TheFramework.h>


class MyApplication : TheFramework::Application {
public:


MyApplication() : Application() {}


void Run() {


  TheFramework::Window *wnd = TheFramework::Window::Create(this,640,480,L"Test window");
 
this->RunWindowEvents(wnd);


}


};


//Program Entry Point Call - Macro
ApplicationStartup(false,MyApplication)


//EOF
------------------------------------------------

Może jeszcze nie idealnie, ale już mniej oko boli i trochę bliżej mu do układu z .NET Framework.
Nie będę przeklejał większości tego 20kb kodu jaki sobie napisałem, ale w każdym razie idea była prosta.

Gdy kiedyś pisałem w C++ to nienawidziłem MFC i innych ciekawych wynalazków. Może głupio, że to pisze, ale zawsze pod Windows wolałem sobie zrobić własny obiektowy framework, który strukturę podstawowych klas i zależności między nimi miał zbliżoną właśnie do .NET Framework. Może mniej dojrzale, może zawierał mniej obiektów, może to po prostu nie był .NET Framework, ale mnie się podobało, i potem przejście na .NET Framework z C++ dla mnie to było jak lekkie kichnięcie, wytarcie noska i potem już zdrowo do przodu 🙂

Teraz jak sobie zrobiłem małą nawrotkę to z braku lepszych pomysłów chciałem poćwiczyć nowe zabawki w C++ i przypomnieć sobie konstrukcję fundamentalnych framework'ów.

Do C++ się przemogłem, budowanie frameworków zawsze sprawiało mi radochę, ale Visual Studio jak świetnie się rozwinął w środowisku zarządzanym tak native C++ mnie trochę zasmuciło.
To wciąż świetne środowisko, ale tak porównując ewolucje z kontekstu .NET Framework, Native C++ zostało moim zdaniem trochę w tyle. Kiedyś dla mnie to było środowisko kompletne,
teraz mam dziwne przeczucie, że czegoś mi brakuje. Albo .NET Framework mnie rozpieścił, albo nie wiem.. mam przysłowiowy "milion" pomysłów co bym zmienił, dodał.. :/
Jest też szansa, że skrycie gdzieś samo C++ mi przestało już dokumentnie pasować - strasznie archaiczny konstrukt 😀

Comments (0)

Skip to main content