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/reference/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