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

wskaźniki w klasie std::vector, funkcje wirtualne

Object Storage Arubacloud
0 głosów
140 wizyt
pytanie zadane 22 maja 2020 w C i C++ przez monterek4444 Początkujący (350 p.)

Witam,

program ma za zadanie pobranie danych do obiektu a następnie zapisanie tego obiektu  do tablicy obiektów vector.

Problem polega na tym, że w tablicy vector wszystkie obiekty są nadpisywane przez ostatni podany obiekt.

Przykładowo podaje atrybuty dla 15 obiektów, i wszystkie obiekty przyjmują atrybuty ostatniego obiektu.

Prosiłbym o jakiekolwiek wskazówki.

kod:

#include <iostream>
#include <vector>
using namespace std;

class Wydarzenie
{
public:
    string data, opis;
    Wydarzenie();
    Wydarzenie(string d, string o);
    Wydarzenie(const Wydarzenie &f);
    ~Wydarzenie(){}
    void zmien_opis();
    virtual void podaj() { cout <<"Data:"; getline(cin, data); cout <<"Opis:"; getline(cin, opis);}
    virtual void wypisz() {cout << "Data:" <<data << ", Opis:" <<opis; }


};

//konstruktor bezparametrowy
Wydarzenie::Wydarzenie()
{
    data = "01.01.1970";
    opis = "brak opisu";
}


//konstruktor parametrowy
Wydarzenie::Wydarzenie(string d, string o)
{
    data = d;
    opis = o;
}


//konstruktor kopiujacy
Wydarzenie::Wydarzenie(const Wydarzenie &f)
{
    data = f.data;
    opis = f.opis;
}


void Wydarzenie::zmien_opis()
{
    cout <<"Podaj opis w celu podmiany:";
    getline(cin, opis);
}




//klasa pochodna 'Koncert'
class Koncert : public Wydarzenie
{
public:
    string nazwaZespolu; int ile; vector <string> tab;
    Koncert();
    Koncert(string d, string o, string nZ, int ileCz):Wydarzenie (d, o){nazwaZespolu = nZ; ile = ileCz;}
    Koncert(const Koncert &f);
    ~Koncert(){}
    void podaj();
    void wypisz();

};


//konstruktor bezparametrowy klasy pochodnej Koncert
Koncert::Koncert() {
    data = "01.01.1970";
    opis = "brak opisu";
    nazwaZespolu = "brakNazwyZespolu";
}


//konstruktor kopiujacy
Koncert::Koncert(const Koncert &f)
{
    data = f.data;
    opis = f.opis;
    nazwaZespolu = f.nazwaZespolu;
}


// metoda klasy pochodnej 'Koncert' podajCzlonkow
void Koncert::podaj()
{
    Wydarzenie::podaj();
    string pom;
    cout <<"Prosze podac czlonkow zespolu: ";
    for (int i=0; i<ile; i++)
    {
        cout <<endl<<"czlonek zespolu nr"<<i+1;
        getline(cin, pom);
        tab.insert(tab.begin()+i, pom);
    }
}


void Koncert::wypisz()
{
    Wydarzenie::wypisz();
    cout <<"nazwa zespolu:"<<nazwaZespolu<<", ";
    cout <<"czlonkowie zespolu:";
    for (int i=0; i<tab.size(); i++)
    {
        cout <<tab[i] <<", ";
    }
}




//klasa pochodna WystawaMalarstwa
class WystawaMalarstwa : public Wydarzenie
{
public:
    string pole; int ile; vector <string> tab;
    WystawaMalarstwa(string d, string o, string p, int ileO):Wydarzenie(d, o) {pole = p; ile = ileO;}
    WystawaMalarstwa();
    WystawaMalarstwa(const WystawaMalarstwa &f);
    ~WystawaMalarstwa(){}

    void podaj();
    void wypisz();
};


// konstruktor bezparametrowy klasy pochodnej 'WystawaMalarstwa'
WystawaMalarstwa::WystawaMalarstwa()
{
    data = "01.01.1970";
    opis = "brak opisu";
    pole = "brakNazwiskaKuratoraWystawy";
}


//konstruktor kopiujacy
WystawaMalarstwa::WystawaMalarstwa(const WystawaMalarstwa &f)
{
    data = f.data;
    opis = f.opis;
    pole = f.pole;
}


//metoda klasy pochodnej 'WystawaMalarstwa' podaj()
void WystawaMalarstwa::podaj()
{
    Wydarzenie::podaj();
    string pom;
    cout <<"prosze podac kuratora wystawy:";
    getline(cin, pole);
    cout <<"Prosze podac ilosc obrazow: ";
    cin>>ile;
    cout <<"Prosze podac nazwy obrazow: ";
    for (int i=0; i<ile; i++)
    {
        cout <<"obraz nr "<<i<<", ";
        getline(cin, pom);
        tab.insert(tab.begin()+i, pom);
    }
}


void WystawaMalarstwa::wypisz()
{
    Wydarzenie::wypisz();
    cout <<", kurator wystawy:"<<pole<<", ";
    cout <<"obrazy:";
    for (int i=0; i<tab.size(); i++)
    {
        if (tab.size()>i+1)
            cout <<tab[i] <<", ";
        else
            cout<<tab[i];
    }
}




int main()
{
    vector <Wydarzenie*> myClass;
    Wydarzenie* p = NULL;

    WystawaMalarstwa w;

    for (int i=0; i< 3; i++)
    {
        p = new Wydarzenie();
        p = &w;
        p->podaj();
        myClass.push_back(p);
    }

    for (int i=0; i<4; i++)
    {
        myClass[i]->wypisz();
        cout <<endl;
    }
    return 0;
}


 

 

1 odpowiedź

+1 głos
odpowiedź 22 maja 2020 przez adrian17 Ekspert (344,860 p.)
wybrane 22 maja 2020 przez monterek4444
 
Najlepsza
    WystawaMalarstwa w;
 
    for (int i=0; i< 3; i++)
    {
        p = new Wydarzenie();
        p = &w;

Nie wpatrywałem się za mocno w kod, ale ta końcówka jest ewidentnie zła.

Tworzysz w pętli nowe wydarzenia, super, po czym... zmieniasz `p` na wkaźnik na ten sam obiekt WystawaMalarstwa? To nic dziwnego, że każdy wskaźnik ma to samo... bo to ten sam obiekt.

komentarz 22 maja 2020 przez adrian17 Ekspert (344,860 p.)

swoją drogą:

for (int i=0; i<4; i++)

tu aby nie wychodzisz poza tablicę?

komentarz 22 maja 2020 przez monterek4444 Początkujący (350 p.)

@adrian17,

Nie mam żadnego pomysłu na to jak to napisać poprawnie, prosiłbym o więcej wskazówek.

komentarz 22 maja 2020 przez monterek4444 Początkujący (350 p.)
@adrian17

Jednak udało mi się rozwiązać problem po Pańskiej wskazówce, dziękuje bardzo.

Podobne pytania

0 głosów
1 odpowiedź 717 wizyt
pytanie zadane 4 kwietnia 2017 w C i C++ przez Sidzej Użytkownik (850 p.)
0 głosów
1 odpowiedź 237 wizyt
0 głosów
3 odpowiedzi 1,271 wizyt
pytanie zadane 2 maja 2017 w C i C++ przez Pajdas Mądrala (5,930 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

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

...