przekazywanie wskaźnika między klasami

0

W jaki sposób ( oprócz przestrzeni nazw ) udostępnić np zmienna HINSTANCE * hInstance w wielu klasach mam np główną klasę aplikacji

class c_application
{
    private:

        HINSTANCE * main_instance;

    public:

        c_application( HINSTANCE in_instance ) : main_instance( & in_instance ) {}
};

i teraz jak tworzę okno, listview, buttona itd to w funkcji CreateWindow muszę podać uchwyt aplikacji a nie chce za każdym razem przekazywać ten uchwyt w konstruktorze. Do nauki winapi stosowałem przestrzeń nazw global:: jednak teraz chciałem to napisać po ludzku na klasach

0
  1. Przekazuj wskaznik do rodzica, i od rodzica pobieraj w trakcie tworzenia okna ten uchwyt.
  2. Zrob ten uchwyt statyczny
    3. Zrob ten uchwyt globalny (fu)

Jakby nie patrzec, skads inna klasa musi miec ten uchwyt.

1

GetModuleHandle(NULL) i nie musisz nic przekazywać.

SPOILER: zarówno hInstance jak i GetModuleHandle(NULL) zwraca za każdym razem magic value 0x400000.
Try it :)

0

zgadza się dzięki za podpowiedź ;) chociaż akurat hInstance podałem jako przykład bo np idąc dalej w głównej klasie aplikacji którą podałem wyżej mam procedurę dla głównego okna a tam np w wiadomości WM_ACTIVATE chce ustawić focusa kontrolce edit której uchwyt mam tylko w swojej klasie c_edit i teraz jak rozwiązujesz takie przekazania pomiędzy klasami? tak jak powiedział n0name_l wszystkie uchwyty w swoich klasach robić jako static i do każdej klasy funkcja np get_edit_instance która będzie zwracała uchwyt do tej kontrolki? czy jakoś inaczej sobie z tym radzisz?

0

Jak zrobisz uchwyt do okna statycznie to będziesz miał tylko jedno okno danej klasy, co w przypadku Edita chyba nie jest pożądane.

funkcja np get_edit_instance która będzie zwracała uchwyt do tej kontrolki?
na przykład... (chociaż "get_handle" byłoby lepszą nazwą od "instance").

chce ustawić focusa kontrolce edit której uchwyt mam tylko w swojej klasie c_edit

a dlaczego nie edit->set_focus(true)? to podstawy obiektowości...

0

SPOILER: zarówno hInstance jak i GetModuleHandle(NULL) zwraca za każdym razem magic value 0x400000.
Try it :)

Nieprawda.
Try it.

<code>>more GetModuleHandle.cpp
#include <Windows.h>
#include <cstdio>

int main()
{
    printf("0x%x\n", GetModuleHandle(NULL));
}

>cl GetModuleHandle.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 17.00.51106.1 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

GetModuleHandle.cpp
Microsoft (R) Incremental Linker Version 11.00.51106.1
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:GetModuleHandle.exe
GetModuleHandle.obj

>GetModuleHandle.exe
0x1300000

>GetModuleHandle.exe
0x3b0000

>GetModuleHandle.exe
0xa30000

>cl GetModuleHandle.cpp /link /base:0x600000 /dynamicbase:no

Microsoft (R) C/C++ Optimizing Compiler Version 17.00.51106.1 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

GetModuleHandle.cpp
Microsoft (R) Incremental Linker Version 11.00.51106.1
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:GetModuleHandle.exe
/base:0x600000
/dynamicbase:no
GetModuleHandle.obj

>GetModuleHandle.exe
0x600000
0
Rev napisał(a):

Nieprawda.
Try it.

To bardzo dziwne. Rzeczywiście program skompilowany VS2012 wyświetla różną liczbę za każdym uruchomieniem.

A pod GCC...

C:\PP>g++ a.cpp

C:\PP>a
0x400000

C:\PP>a
0x400000

C:\PP>a
0x400000

C:\PP>a
0x400000

C:\PP>a
0x400000

C:\PP>a
0x400000

C:\PP>a
0x400000

C:\PP>a
0x400000

C:\PP>a
0x400000

C:\PP>

EDIT: address space randomization. Ach no tak.

1 użytkowników online, w tym zalogowanych: 0, gości: 1