• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zmienne wirtualne. Jak napisać żeby było czytelnie i wydajnie?

Object Storage Arubacloud
0 głosów
218 wizyt
pytanie zadane 23 marca 2022 w C i C++ przez Daaa22 Dyskutant (8,250 p.)

Problem wygląda tak

#include <iostream>

class Square
{
public:
    virtual void event() = 0;
};

class GoToJail : public Square
{
public:
    const int type = 0;

    void event()
    {
        //jakis kod
    }
};

class Property : public Square
{
public:
    const int type = 1;

    void event()
    {
        //jakis kod
    }
};

class Empty : public Square
{
public:
    const int type = 2;

    void event()
    {
        //jakis kod
    }
};

int main()
{
    Property property[ 3 ];
    Empty empty;
    GoToJail gotojail;

    Square *square[ 5 ];

    square[ 0 ] = &empty;
    square[ 1 ] = &property[ 0 ];
    square[ 2 ] = &property[ 1 ];
    square[ 3 ] = &property[ 2 ];
    square[ 4 ] = &gotojail;

    std::cout << square[ 3 ] -> type;

    return 0;
}

Jak zrobić żeby pisząc square[ n ] -> type wyświetlało mi typ pola o indeksie n? Można dodać virtual int getType() każdej klasie ale wydaje mi się że dodawanie dodatkowej metody jest trochę nieładne i też nie wiem czy wywoływanie tej metody nie jest mniej wydajne od przekazywania od razu zmiennej. Czytałem też coś o dynamic_cast ale też to rozwiązanie intuicyjnie nie wydaje mi się najbardziej optymalne. Jak profesjonalny programista by to rozwiązał?

1 odpowiedź

+2 głosów
odpowiedź 23 marca 2022 przez tangarr Mędrzec (154,860 p.)
wybrane 23 marca 2022 przez Daaa22
 
Najlepsza

Troszkę się zapędziłeś z tym "wirualizowaniem zmiennych".
Wystarczy, żebyś miał zmienną typ w klasie bazowej i inicjalizował ją w konstruktorze.

class Square
{
public:
    const int type;
    Square(int _type) : type(_type) {}
    virtual ~Square() {} // pamiętaj o wirtualnym destruktorze w klasie bazowej !!!
    virtual void event() = 0;
};
 
class GoToJail : public Square
{
public:
    GoToJail() : Square(0) {}
 
    void event()
    {
        //jakis kod
    }
};

class Property : public Square
{
public:
    Property() : Square(1) {}
 
    void event()
    {
        //jakis kod
    }
};

 

1
komentarz 23 marca 2022 przez Daaa22 Dyskutant (8,250 p.)
Bardzo fajne rozwiązanie, dzięki. A co do wirtualnego destruktora, on jest zawsze potrzebny? Czy na przykład gdy każda pochodna klasy bazowej zajmuje dokładnie tyle samo pamięci i nie ma nigdzie dynamicznej alokacji pamięci to wirtualny destruktor można pominąć? Są jakieś sytuacje gdy wirtualny destruktor nie jest potrzebny?
komentarz 24 marca 2022 przez Oscar Nałogowiec (29,320 p.)
Najbezpieczniej jest dać wirtualny destruktor - nigdy nie wiesz, czy jakiejś klasy jeszcze gdzieś nie użyjesz (w tym albo innym projekcie) i z niej nie wydziedziczysz jakiejś innej klasy.  O ile w momencie pisania wiadomo z czego dana klasa dziedziczy, to nie wiadomo gdzie będzie sama jeszcze użyta. Problemem nie jest to czy dana klasa potrzebuje w ogóle destruktora (ma on co robić), ale wywołanie destruktora w momencie gdy stosujesz wskaźniki lub referencje na klase bazową. Gdy destruktor klasy bazowej nie jest wirtualny zostanie wywołany zawsze on, a nie destruktor klasy aktualnej (który już może mieć coś do wykonania).

Podobne pytania

+1 głos
2 odpowiedzi 1,255 wizyt
pytanie zadane 29 stycznia 2019 w C i C++ przez Seqak Początkujący (420 p.)
+1 głos
1 odpowiedź 528 wizyt
0 głosów
1 odpowiedź 133 wizyt
pytanie zadane 8 grudnia 2016 w C i C++ przez DODO Bywalec (2,950 p.)

92,702 zapytań

141,615 odpowiedzi

320,180 komentarzy

62,060 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...