Jak napisać tablicę wskaźników danej klasy?

0

Siedzę obecnie przy klasach, i wskaźnikach do pól klasy. Zacząłem więc kombinować dodatkowo z tablicą jednowymiarową. I tu problem jak połączyć klase, wskaźnik, i tablice.
Utworzyłem klasę Osoba i utworzyłem obiekt wskaźnikowy Osoba *czlowiek.
A chce zrobić taki programik żeby użytkownik najpierw wpisał ile osób będzie w tablicy, a potem podaje imiona nazwiska i wiek poszczególnych osób.
Jak nie używam wskaźników, tylko w zwykły sposób się odwołuję do pól to wszystko gra. Tylko teraz jak podpiąć to pod wskaźniki?

#include<iostream>
using namespace std;
class Osoba{
    public:
        string imie;
        string nazwisko;
        int wiek;
};
int main(){
    int ile;
    cout<<"Ile osob?: ";
    cin>>ile;
    Osoba *czlowiek=new Osoba;
    Osoba *czlowiek[ile];
    for(int i=0; i<ile; i++){
    cout<<"Podaj imie "<<i+1<<" osoby: ";
    cin>>czlowiek[i]->imie;
    cout<<"Podaj nazwisko"<<i+1<<" osoby:";
    cin>>czlowiek[i]->nazwisko;
    cout<<"Podaj wiek"<<i+1<<" osoby:";
    cin>>czlowiek[i]->wiek;
    }
    for(int i=0; i<ile; i++){
        cout<<"imie, nazwisko i wiek "<<i+1<<" osoby: "<<czlowiek[i]->imie<<" "<<czlowiek[i]->nazwisko<<" ma "<<czlowiek[i]->wiek<<" lat(a)"<<endl;
    }
    for(int i=0; i<ile; i++){
        delete czlowiek[i];
    }
    return 0;
}
1
    Osoba *czlowiek=new Osoba;
    Osoba *czlowiek[ile];

he? powinno być:

Osoba* czlowiek = new Osoba[ile];

dalej nie sprawdzałem

EDIT:

    for(int i=0; i<ile; i++){
        delete czlowiek[i];
    }

zamień na:

delete[] czlowiek;
0

lub wykjorzystać RAII http://ideone.com/bVKiwd

0

bo chodziło o tablicę wskaźników;

lepiej odwoływać się​ do obiektów poprzez wskaźnik (nie tworzysz dodatkowych kopii);

no i nie bądźmy tak krótkowzroczni nawet jeżeli jest to tylko snippet;

w większym projekcie i tak prawdopodobnie dla podobnych obiektów użyłbyś prawdopodobnie mapy co pozwoliłoby na łatwiejsze znalezienie konkretnej osoby, tutaj możesz to zrobić za pomocą std::find lub std::find_if (dla predykatów)

0

Czemu lepiej odwoywac sie przez wskaznik? Przeciez i tak obiekt lezy na stercie i tak tyle ze dochodzi nam dodatkowa tablica unique_ptr.

0

no ale jak masz obiekt na stercie (heapie) to możesz się do niego odwołać tylko przez wskaźnik lub referencję;

i pomyśl, że kopiujesz taki obiekt, który żyje we własnym wątku (np synchronizuje się z bazą danych), a Ty go modyfikujesz na kopii z zewnątrz -> Twoje dane nie zostaną wprowadzone;

1

przecież elementy klasy vector leżą na stercie i operator[] zwraca referencję:
http://www.cplusplus.com/refe[...]vector/vector/operator%5B%5D/

0

no dobrze co ja coś pisałem o tym że masz zrobić z vectora wskaźnik?

miałem na myśli, że poprzez iterator wektora i tak odwołujesz się do wskaźnika, na którym potem pracujesz;

vector jest trzymany przez jakiś obiekt do zarządzania osobami, który pracuje na this tak tu nawet nie ma kopii, ale dlaczego ja to muszę tłumaczyć?

0

this jest wskaźnikiem który odwołuje się​do heap tak dla jasności

ja tylko chciałęm pokazać użycie unique_ptr jako podstawy używania RAII, unique_ptr do tego gwarantuje niekopiowalność obiektu; chcesz używać std::vector<osoba>, proszę bardzo

koniec dyskusji w tym temacie jak dla mnie

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0