vector wskaźników do struktur - problem z dodawaniem element

0

Mam taki kod:

class person {
        private:
        char* firstname;
        char* lastname;
        int func;

        public:
        person(int lFname, char* fname, int lLname, char* lname, int func) {
                this->firstname = new char[lFname+1];
                this->firstname[lFname]='\0';
                this->firstname = fname;
                this->lastname = new char[lLname+1];
                this->lastname[lLname]='\0';
                this->lastname = lname;
                this->func = func;
        }

        ~person() {
                delete[] this->firstname;
                delete[] this->lastname;
        }

        ...
};

person* member;
vector<person> membersList;

...

member = new person(l1, cfname, l2, clname, func);
membersList.push_back(*member);

...

i teraz jak chce wypisać osoby na ekranie:

                String name;
                for(unsigned int i=0; i<membersList.size(); i++) {
                      member = &membersList[i];
                      name = member->getFirstname();
                      name += " ";
                      name += member->getLastname();
                      name += " (";
                      name += member->getFunction();
                      name += ")";
                      ListBox1->Items->Add(name);
                }

to imie i nazwisko ostatnio dodanej osoby są prawidłowo wyświetlane na ekranie a wcześniejsze osoby maja jakieś dziwne krzaczki w polu firstname i lastname

0

Cool. Ale przyjmijmy, że pytanie brzmi "Jaki wacek to powoduje?". Jeśli tak, to odpowiedź jest taka: musisz zrobić tej swojej klasie dodatkowo konstruktor kopiujący - bez tego trochę zaczyna się sypać... Ale nie jestem pewien.

0
manfredek napisał(a)

musisz zrobić tej swojej klasie dodatkowo konstruktor kopiujący

Albo nauczyc sie jak dzialaja wskazniki i jak sie z nimi pracuje. 8-O

vector<person*> membersList;

...

member = new person(l1, cfname, l2, clname, func);
membersList.push_back(member);
0

@up: no ale jest wektor struktur, nie wskaźników.

@topic: ale czym ma być

this->firstname = fname;

ithis->lastname = lname;

? Czy serio myślisz, że to skopiuje cstring? Nieźle rozwalasz pamięć...
0
manfredek napisał(a)

@up: no ale jest wektor struktur, nie wskaźników.

Niepotrzebnie, po co robić wektor struktur i kopiować struktury przy dodawaniu do wektora? To jest niepotrzebne obciążanie procesora i doprawdy nie ma żadnego powodu żeby to był wektor struktur a nie wektor wskaźników na struktury i nie ma sensu nabierać takich nawyków.

manfredek napisał(a)

@topic: ale czym ma być

this->firstname = fname;

ithis->lastname = lname;

? Czy serio myślisz, że to skopiuje cstring? Nieźle rozwalasz pamięć...


No to już jest inna historia.
0
EgonOlsen napisał(a)

Niepotrzebnie, po co robić wektor struktur i kopiować struktury przy dodawaniu do wektora? To jest niepotrzebne obciążanie procesora i doprawdy nie ma żadnego powodu żeby to był wektor struktur a nie wektor wskaźników na struktury i nie ma sensu nabierać takich nawyków.
Mi tego mówić nie musisz.

0

Tak więc mamy:
1.

        person(int lFname, char* fname, int lLname, char* lname, int func) {
                firstname = new char[lFname+1];
                memset (firstname ,0x00,lFname+1);
                memcpy(firstname,fname,lFname);
                ...
        }

http://www.cplusplus.com/reference/clibrary/cstring/memset/
http://www.cplusplus.com/reference/clibrary/cstring/memcpy/

person* member;
vector<person*> membersList;
...
member = new person(l1, cfname, l2, clname, func);
membersList.push_back(member);

Tylko nie zapomnij na końcu wyczyścić pamięci na którą wskazują wskaźniki w wektorze ;)

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