• 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

0 głosów
84 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 (302,720 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 (302,720 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ź 289 wizyt
pytanie zadane 4 kwietnia 2017 w C i C++ przez Sidzej Użytkownik (850 p.)
0 głosów
1 odpowiedź 75 wizyt
0 głosów
3 odpowiedzi 749 wizyt
pytanie zadane 2 maja 2017 w C i C++ przez Pajdas Mądrala (5,930 p.)

85,774 zapytań

134,555 odpowiedzi

298,695 komentarzy

56,666 pasjonatów

Advent of Code 2021

Top 15 użytkowników

  1. 64p. - nidomika
  2. 62p. - ScriptyChris
  3. 60p. - Whistleroosh
  4. 57p. - adrian17
  5. 55p. - B4mbus
  6. 55p. - CC PL
  7. 53p. - Klaudia
  8. 50p. - WhiskeyTaster
  9. 47p. - rucin93
  10. 45p. - tokox
  11. 44p. - Adrian Rębisz
  12. 43p. - Michał Tartanus
  13. 41p. - Jarosław Roszyk
  14. 38p. - Argeento
  15. 18p. - Marcin Harasimowicz
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...