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

question-closed Programowanie obiektowe - dynamiczne tablice dwuwymiarowe

Object Storage Arubacloud
0 głosów
152 wizyt
pytanie zadane 19 listopada 2020 w C i C++ przez WojtkoloS Obywatel (1,220 p.)
otagowane ponownie 20 listopada 2020 przez WojtkoloS

Hej, przychodzę z pytaniem odnośnie zarządzania pamięcią dynamicznych tablic dwuwymiarowych. Czy błąd wynika z błędnego tworzenia tablicy wskaźników? Czy da się stworzyć tablicę wskaźników klasy Obj mieszając obiekty Object1 i Object2? Z góry podkreślam, iż niestety nie mogę użyć żadnych zewnętrznych bibliotek typu array(mogę użyć tylko iostream niestety).

#include <iostream>

class Obj {
protected:
    int number_; 
public:
    Obj();
    Obj(int);

    virtual void input() = 0;
    virtual void disp() = 0;
};
Obj::Obj() { number_ = 0; }
Obj::Obj(int number): number_(number) {}

class Object1 : protected Obj{
    int status_;
    std::string name_;
public:
    Object1();
    Object1(int, int, std::string);

    virtual void input() { std::cin >> status_; std::cin >> name_; std::cin >> number_; }
    virtual void disp() { std::cout << "| OBJ1 " << status_ << " " << name_ << " | "; }
};

Object1::Object1() : Obj(), status_(0), name_("") {}
Object1::Object1(int number, int status, std::string name) : Obj(number), status_(status), name_(name) {}

class Object2 : public Obj {
    int age_;
    std::string name_;

public:
    Object2();
    Object2(int, int, std::string);
    
    virtual void input() { std::cin >> age_; std::cin >> name_; std::cin >> number_; }
    virtual void disp() { std::cout << "| OBJ2 " << age_ << " " << name_ << " | "; }
};
Object2::Object2() : Obj(), age_(0), name_("") {}
Object2::Object2(int number, int age, std::string name) : Obj(number), age_(age), name_(name) {}

int main()
{
    int size1 = 2, size2 = 5;



    Obj** vector = new Obj* [size1];

    /*for (int i = 0; i < size1; i++) {
        if (i % 2 == 0) {
            vector[i] = new Object1[size2];
        }
        else{
            vector[i] = new Object1[size2];
        }
    }*/

    vector[0] = new Object1[size2];
    vector[1] = new Object2[size2];

    for (int i = 0; i < size1; i++) {
        for (int j = 0; j < size2; j++) {
            vector[i][j].input();
        }
    }


    for (int i = 0; i < size1; i++){
        for (int j = 0; j < size2; j++) {
            vector[i][j].disp();
            std::cout << " ";
        }
    }

    for (int i = 0; i < size1; i++) {
        delete[] vector[i];
    }
    delete[] vector;

}

 

komentarz zamknięcia: nie znalazlem odpowiedzi...

1 odpowiedź

+1 głos
odpowiedź 19 listopada 2020 przez tangarr Mędrzec (154,860 p.)

Twoja dwuwymiarowa tablica zaciemnia ci zrozumienie tego problemu.
Uprośćmy go więc.
Spójrz na taki kod

Obj obj1 = Object1();
Obj obj2 = Object2();

Czy ten kod się skompiluje i dlaczego nie?
Kod się nie skompiluje dlatego, że klasa Object1/2 nie jest klasą Obj.
 

Ale jak w takim razie użyć polimorfizmu? Trzeba wprowadzić drobną zmianę, musimy użyć wskaźników.

Obj *obj1 = new Object1();
Obj *obj2 = new Object2();

Jak w takim razie utworzyć tablicę takich obiektów? Dla ułatwienia zdefiniujmy sobie nowy typ (ten krok nie jest potrzebny ale pomoże zrozumieć problem).

using ObjPtr = Obj*;

ObjPtr *tablica = new ObjPtr[2];
tablica[0] = new Object1();
tablica[1] = new Object2();

Dla tablicy dwuwymiarowej  zachowujemy się analogicznie

using ObjPtr = Obj*;

ObjPtr **tablica = new ObjPtr*[2];
tablica[0] = new ObjPtr[10];
tablica[1] = new ObjPtr[10];
for (int i=0; i<10; i++) {
    tablica[0][i] = new Object1();
    tablica[1][i] = new Object2();
}

PS. Biblioteki array i vector są tak samo "bibliotekami zewnętrznymi" jak bibliotek iostream.

Podobne pytania

0 głosów
2 odpowiedzi 316 wizyt
0 głosów
2 odpowiedzi 726 wizyt
pytanie zadane 2 marca 2017 w C i C++ przez Mateusz Ścigała Początkujący (280 p.)
0 głosów
0 odpowiedzi 292 wizyt
pytanie zadane 10 grudnia 2016 w C i C++ przez jeżuś Nowicjusz (200 p.)

92,568 zapytań

141,422 odpowiedzi

319,641 komentarzy

61,957 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!

...