• 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
205 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,780 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,290 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,133 wizyt
pytanie zadane 29 stycznia 2019 w C i C++ przez Seqak Początkujący (420 p.)
+1 głos
1 odpowiedź 518 wizyt
0 głosów
1 odpowiedź 129 wizyt
pytanie zadane 8 grudnia 2016 w C i C++ przez DODO Bywalec (2,950 p.)

92,556 zapytań

141,403 odpowiedzi

319,559 komentarzy

61,942 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...