[C++] wskaźniki globalne

2010-11-12 11:51
Początkujący99
0

Witam!

Ma kilka plików cpp ( A.cpp , B.cpp, Obraz.h i Obraz.cpp ...)
Wszystkie pliki korzystają z obiektów własnej klasy OBRAZ
Wpadłem na pomysł, by zamiast includować plik Obraz.h ( z deklarcją klasy OBRAZ)
stworzyć globalne obiekty OBRAZ:

//     ***    Plik A.cpp  ***
#include Obraz.h  //   zawiera klasę Obraz
extern void KonfigurujObraz(); //  Jej def. jest w B.cpp 
int const iRozmiar = 5;
Obraz *pObr[ iRozmiar ];  // tworzę globalny wsk do tablicy własnych obiektów OBRAZ

int main()
{
     for( int i = 0; i<  iRozmiar  ; i++)  pObr[i] = new Obraz;  // alokuje na stercie 
     KonfigurujObraz();   // funkcja  w pliku B.cpp  utworzy nowe obiekty na stercie    
}

//     ***   Plik B.cpp  ***
extern int const iRozmiar ; // jej def. jest w a.cpp
extern Obraz **ppObr;  // To ma być globalny wsk do tablicy OBIEKTÓW , a nie jest !
void KonfigurujObraz();
{
      ....    //   ustawiam różne  zmiennne 
     for( int i = 0; i<  iRozmiar  ; i++)  ppObr[i] = new Obraz (int, int, TCHAR*, TCHAR*);  // alokuje na stercie 
}

I okazuje się , że zmienna wskaźnikowa &pObr[i] w A.cpp i &ppObr[i] w B.cpp nie są tymi samymi zmiennymi.
1 .Czy wskaźniki do obiektów zadeklarowane w przestrzeni globalnej są statyczne ( wiązane wewnętrznie)?

  1. Czy mogę im nadać cechę wiązanie zewnętrznego ?
  2. Cz jest to niewłaściwe podejście i należy includować plik Obraz.h ( z deklarcją klasy OBRAZ)

Pozostało 580 znaków

2010-11-12 15:04
Początkujący99
0

Przepraszam , pierwsze dwa pyt. są nieaktualne - popełniłem błąd. Trzecie owszem...
Utworzyłem wsk do wsk i on jest globalny, ale wsk do obiektu już jest lokalny, czego wcześniej nie zauważyłem sugerując sie deklaracją

    Obraz * pObr  [iRozmiar]

Zauważyłem , że wskaźniki i tablice są nieco w C++ "nieintuicyjne"

Pozostało 580 znaków

2010-11-12 18:11
nobody
0
Początkujący99 napisał(a)

[...] Zauważyłem , że wskaźniki i tablice są nieco w C++ "nieintuicyjne"

To żeby newbie tak szybko tego nie skumali :> inaczej język byłby zbyt prosty :D książki by ci się tak nie sprzedawały :> interes by się nie kręcił :>

ale tak poważnie - to po prostu tak działa tablica niskopoziomowo, jest ona adresem bazowym z odpowiednim przesunięciem (adres[przesunięcie]), co to ma się do intuicji?
a ty byś pewnie chciał tak:
int tablica[] = array(); //po co podawać teraz wielkość, a niech się sama rozszerza
tablica[0] = 0; tablica['heh :>'] = 3; //prawie jak w php :>
tylko, że wtedy takie dynamiczne rozszerzanie zawsze niesie ze sobą jakiś narzut, którego w C++ nie tolerujemy :P po co ci druga java?
poza tym nikt ci nie broni zaimplementować takiej tablicy, jak ktoś chce to się da...
ba nawet możesz sobie zaimplementować ogólną klasę dla zmiennych
class var { [..] };
var a = 123;
a = "wow";
nikt ci tego nie broni, tylko że takie sprawdzanie typu co każdą operację zawsze kosztuje, a nie po to jest C++...

Pozostało 580 znaków

2010-11-12 18:51
0

a ty byś pewnie chciał tak:

przydałaby się kontrola rozmiaru tablicy, jak to jest w cywilizowanych językach:

int[3] FooBar(int[5] parametr);

i taka funkcja przyjmowałaby tablicę PIĘCIU intów, a zwracała TRZECH. przypisanie tablicy innego rozmiaru zgłaszałoby błąd podczas kompilacji.
obecnie da się coś takiego zrobić na template'ach, ale to powinno być w C od samego początku.
Nie ma w tym żadnego narzutu – mowa o kontroli w czasie kompilacji.

edytowany 2x, ostatnio: Azarien, 2010-11-12 18:53

Pozostało 580 znaków

2010-11-12 20:01
nobody
0

faktycznie warning/error o bezpośrednim przekroczeniu statycznej tablicy mógłby się przydać, ale jak wiadomo działało by to tylko w tym bezpośrednim przypadku, bo jak piszesz przez wskaźnik albo do dynamicznej to już w czasie kompilacji ci tego nie da rady wykryć...

aczkolwiek to miałoby praktycznie nie duże znaczenie, bo aż takich byków żeby bezpośrednio walić do za dużych indeksów się nie robi :>

no i kto zwraca tablicę przez return :> ja w życiu tego nie robiłem :>

Pozostało 580 znaków

2010-11-12 20:05
.....
0
nobody napisał(a)

class var { [..] };
var a = 123;
a = "wow";

W Bashu tak jest od razu ;-)

zmienna="wow"
zmienna=$(( 12 + 3 ))

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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