Tworzenie kolekcji

Odpowiedz Nowy wątek
2014-05-23 23:19
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.


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:

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;

Pozostało 580 znaków

2014-05-23 23:39
0

Pokaż najlepiej całą klasę Pracownik.

Pozostało 580 znaków

2014-05-23 23:42

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

#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

Pozostało 580 znaków

2014-05-23 23:55
0

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

A tutaj podaje większy fragment mojej klasy:


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

Pozostało 580 znaków

2014-05-23 23:58
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.

Pozostało 580 znaków

2014-05-24 00:02
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?

Pozostało 580 znaków

2014-05-24 00:05
1

No jest.

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;
}

Pozostało 580 znaków

2014-05-24 00:07
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ę.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2014-05-24 00:13
0

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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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