Autor Wątek: Przypisanie do zmiennej globalnej a konstruktor  (Przeczytany 654 razy)

*

  • Gość
# Maj 16, 2010, 11:43:18
Hej,

Mam taki kod:
class Foo
{
 Foo()
 {
   jakasFunkcja();
 }
};

// ...

void jakasFunkcja()
{
 foo->cos();
}
// ...

extern Foo* foo;

// ...

foo = new Foo();
I oczywiście odowłuję się do zmiennej globalnej foo która ma wartość NULL ponieważ zanim wykonam przypisanie wywołuję konstruktor klasy Foo któy wywołuje metodę korzystającą z globalnego wskaźnika foo.

Pytanie: Czy da się to obejść bez dodatkowej metody? Np.:
class Foo
{
 wykonaj()
 {
  jakasFunkcja();
 }
};

// ...

foo = new Foo();
foo->wykonaj();
Taki sposób jest Ok, problem w tym że nie jest zbytnio wygodny. Podobnych obiektów (nie globalnych, lecz tych na który wskaźnik jest w klasie globalnej, a one wykonują jakąś funkcję która bezpośrednio wskaźnika na tą klasę pobierać nie może) jest dosyć dużo, i takie rozwiązanie nie jest zbyt dobre.

Jeżeli to pomoże to powiem iż korzystam z WinAPI i w WndProc(...) potrzebuję odwołać się do wskaźnika globalnego. A okno tworzę właśnie w konstruktorze pewnej klasy.

Pozdrawiam

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Maj 16, 2010, 11:52:30
A po co robisz globalny wskaźnik, zamiast globalnego obiektu? Wtedy miałbyś go skonstruowanego i przygotowanego na starcie. :)

Offline Xion

  • Redaktor
    • xion.log

# Maj 16, 2010, 13:41:31
A po co robisz globalny wskaźnik, zamiast globalnego obiektu? Wtedy miałbyś go skonstruowanego i przygotowanego na starcie. :)
Wszystko pięknie, tylko że przy używaniu globalnych obiektów trzeba pamiętać o kolejności ich inicjalizacji (a raczej o tym, jak bardzo niezdefiniowana potrafi ona być).

Offline Groshu

  • Użytkownik

# Maj 16, 2010, 13:53:09
Utwórz drugi konstruktor, do inicjacji globalnego obiektu. Reszta obiektów będzie mogła już być tworzona przy użyciu konstruktora domyślnego, bo obiekt globalny będzie już istniał ;)

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Maj 16, 2010, 13:56:23
Wszystko pięknie, tylko że przy używaniu globalnych obiektów trzeba pamiętać o kolejności ich inicjalizacji (a raczej o tym, jak bardzo niezdefiniowana potrafi ona być).
Po prostu nie należy w konstruktorze robić dziwnych rzeczy (np. używać innych obiektów globalnych) i będzie dobre. :)