[ oop ] wskaźnik na dwa typy

0

Witam

Mam 2 problemy, oto pierwszy:
Mam klasę Cell i klasy Brick oraz Picture, które dziedziczą z Cell. W innej klasie Map chcę utworzyć wskaźnik typu Cell, który raz będzie wskazywał na Brick, a raz na Picture. Czy jest takie coś możliwe?

Chciałbym się do tego odwoływać w ten sposób:
myMap -> selectedCell = &this -> bricks[ id ]; // ustawiam wskaźnik na obiekt typu Brick
a innym razem:
myMap -> selectedCell = &this -> pictures[ id ]; // teraz na obiekt typu Picture

Drugi problem:
Gdybym już to miał, to jak w klasie typu Brick/Picture sprawdzić, czy wskaźnik ten wskazuje na dany obiekt? Mniej więcej takie coś:

if( this == &myMap -> selectedCell ) ...

zadziała?

Mam nadzieję, że w miarę jasno napisałem.
Pozdrawiam.

0
Cell* wskaznik; //to moze wskazywac na obiekt typu Cell, Brick, Picture
  1. Tak, powinno zadzialac. Jesli adresy beda sie zgadzac (a w tym wypadku powinny) to nie ma zadnych powodow, zeby porownac w ten sposob wskazniki wskazujace na jakikolwiek typ.
0

Wskaźnik do obiektu klasy podstawowej moze wskazywać na obiekty klas pochodnych.
Poza tym zainteresuj się funkcjami wirualnymi i polimorfizmem, bo chyba to załatwi ci kwestie "sprawdzania na jaki obiekt" jest ustawiony wskaźnik.

0

Kod wewnątrz klasy Brick:

if( this == &myMap -> selectedBrick )

Komunikat błędu:

35 ...\brick.cpp comparison between distinct pointer types Brick*' and Cell**' lacks a cast

Jak w takim razie mam się odwołać do tego?
(Dynamicznie tworzę tabelę elementów typu Brick)

Pozdrawiam

0

A nie mozesz tego zrobic w ten sposob, ze:

myMap->selectedCell->zrobCos();

gdzie zrobCos to metoda wirtualna? Co chcesz uzyskac?

0

ok poradziłem sobie metodami wirtualnymi :)

Jeszcze jedno małe pytanko:
w klasie pochodnej mam np jakąś zmienną, której nie ma w klasie bazowej. jak się do niej odwołać poprzez wskaźnik na klasę bazową?

Tzn wskaźnik typu Cell wskazuje albo na Brick albo na Picture. Klasa Brick ma dodatkową zmienną, powiedzmy type.

Polecenie:
this -> selectedCell -> type
wywala błąd. Bo klasa cell nie ma zmiennej type.
Da się to jakoś ominąć ?
Nie chcę mieć tej zmiennej ani w Cell ani w Picture.

pozdrawiam

0

To przemysl strukture. W dziedziczeniu chodzi glownie o to by implementacja byla nieistotna dla tego, kto z niej korzysta. Jesli Brick ma dodatkowa zmienna, to najwyrazniej ta implementacja klasy Cell jest szczegolna i takiej zmiennej wymaga. Ale to nie znaczy, ze Cell czy uzytkownik klasy ma o niej cos wiedziec.

W Twoim wypadku uzytkownik ma wiedziec, ze obiekt ma skladowa type - to znaczy, ze uzytkownik musi wiedziec jakiego konkretnie typu jest aktualnie uzywany obiekt ;) Zdecyduj sie w takim razie czy uzytkownik korzysta z polimorfizmu i zapomina o konkretyzacji czy jednak ma wiedziec z jakiego dokladnie obiektu wlasnie korzysta :P

Jesli to pierwsze to zamknij uzycia zmiennej w metodach wirtualnych, jesli to drugie to zrzutuj wskaznik na konkretny typ (niewskazane w ogole, a jezeli juz to w wyjatkowych sytuacjach).

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