Tworzenie kolekcji

Tworzenie kolekcji
S2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 33
0

Witam,
tworzę prosty program w którym mam kilka klas. Chciałbym żeby to działało mniej więcej tak: tworze obiekt, odpowiednią metodą wczytuje dane i przekazuje dane do mojej kolekcji. Chce mieć do wprowadzonych danych swobodny dostęp, wyświetlać je, usuwać itd. Próbowałem to zrobić na wektorach ale cały czas coś mi nie chce działać, tzn wiem co chyba mam źle ale nie wiem jak z tego wyjść.
Fragment kodu:
mam klase pracownik w której mam imie nazwisko itd.

Kopiuj
 
int main()
{
vector <Pracownik> lista;

Pracownik nowy_pracownik;
nowy_pracownik.Wpisz();
lista.push_back(nowy_pracownik);
return 0;
}

powyższy kod sie pod koniec wywala, druga wersja nie działa poprawnie:

Kopiuj
int main()
{
vector <const Pracownik*> lista;
Pracownik nowy_pracownik;
nowy_pracownik.Wpisz();
lista.push_back(&nowy_pracownik);
vector<const Pracownik*>::iterator itd=lista.begin();

cout << *itd;
return 0;
Lucas Darkstorm
  • Rejestracja: dni
  • Ostatnio: dni
0

Pokaż najlepiej całą klasę Pracownik.

n0name_l
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2412
3

A nie moze cos innego tworzyc tych obiektow? Bo generalnie najprosciej bedzie jak zrobisz tak:

Kopiuj
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;

class Person {
  friend istream& operator>>(istream& in, Person& p) { return in >> p.name; }
  friend ostream& operator<<(ostream& out, const Person& p) { return out << p.name; }

  string name;
};

int main(int argc, char *argv[]) {
  vector<Person> persons;
  copy(istream_iterator<Person>(cin), istream_iterator<Person>(), back_inserter(persons));
  copy(persons.begin(), persons.end(), ostream_iterator<Person>(cout, "\n"));
  return 0;
}

http://ideone.com/bqWklj

S2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 33
0

n0name_l rozumiem ze do wektora kopiujesz po prostu dane dane z wejscia?

A tutaj podaje większy fragment mojej klasy:

Kopiuj
 
class Pracownik
{
	char *pszImie;
	char *pszNazwisko;
	Data DataUrodzenia;
	static int siLiczPrac;
public:

	Pracownik();
	Pracownik(const Pracownik &nowy_pracownik);
	~Pracownik();
	const char* Imie() const;
	const char* Nazwisko() const;
	void Imie(const char* nowe_imie);
	void Nazwisko(const char* nowe_nazwisko);
	void funDataUrodzenia(int nowy_dzien, int nowy_miesiac, int nowy_rok); 
	void Wypisz() const;
	void Wpisz();

Opisz metod w linku: http://www.wklejto.pl/201890

n0name_l
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2412
0

W gruncie rzeczy tak. W twoim przypadku wystarczy zamienic char* na string i dodac operatory, ktore beda wiedzialy jak pobrac dane z wejscia i wpisac w odpowiednie pola, reszta zajmie sie funkcja copy.

S2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 33
0

Ok. To myśle że problem teoretycznie rozwiązany ;) A tak jeszcze drążąc temat, to jest możliwość zrobienia tego w taki toporny sposób jak próbowałem?

n0name_l
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2412
1

No jest.

Kopiuj
int main() {
  string tmpName;
  vector<Person> persons;
  while(cin >> tmpName) persons.push_back(Person(tmpName);
  for(const Person& p : persons) cout << p.getName();
  return 0;
}
_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
2

Ten pierwszy toporny teoretycznie poprawny oprócz jednego.
W konstruktorze kopiującym musisz wpisać NULL w nazwisko i imie przed wywołaniem funkcji kopiujących, ponieważ oni najpierw zwalniają to co jest.
A ponieważ masz tam śmieci to zwalniany zostaje losowy fragment pamięci co w końcu doprowadza do wywalenia się.

S2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 33
0

Ok, rozumiem. Popracuje nad tym ;) Dzięki ;)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.