stl - wskaźniki na obiekty

0

Witam.
Mam problem z wywołaniem metody print klasy Person. Nie wiem w czym tkwi problem, siedziałem nad tym problemem sporo czasu, ale nigdzie nie mogłem znaleźć odpowiedzi. Dopiero zaczynam z STL-em i próbowałem napisać sobie prosty programik, ale niestety utknąłem w tym miejscu. Czy ktoś mógłby na to zerknąć i wytłumaczyć mi gdzie popełniam błąd? Z góry dziękuje za odpowiedź.

#include <iostream>
#include <list>

using namespace std;

        class Person 
        {
            string name;
            int  year;

            public:

            void print() 
                {
              cout << name << "-" << year << endl;
            }

            Person(string n=" ", int r=1):name(n),year(r){}
        }; 

       void printPerson(list< Person*>& listt)
       {
             for ( list< Person*>::iterator it = listt.begin(); it != listt.end(); it++ )
               (*it)->print();
       }

       void dod(list<Person*>& listt)
       {    
             Person john ("John",25); 
             Person mary ("Mary",18); 
             Person sue ("Sue",9);
             listt.push_back(&john);
             listt.push_back(&mary);
             listt.push_back(&sue);
       }

       int main() 
       {
           list< Person*> listt;
           dod(listt);     
           printPerson(listt);

           return 0;
       }
2

Próbujesz przesłać wskaźniki na pamięć lokalną, bardzo brzydko.
Złota zasada:

  1. Nigdy nie potrzebujesz wskaźników w kontenerach.
  2. Jeśli już potrzebujesz, to niech to będą inteligentne wskaźniki.

list<person>, ewentualnie emplace_*() i voila.

Wariant pierwszy:

#include <iostream>
#include <string>
#include <list>
using namespace std;

template<typename T>
struct Stringifiable{
    virtual T stringify() const = 0;
};

template<typename T>
T stringified(const Stringifiable<T> &stringifiable){
    return stringifiable.stringify();
}

struct Person: Stringifiable<string>{
    string name;
    unsigned year;

    Person(const string &name, unsigned year): name(name), year(year){}

    string stringify() const{
        return string("Name: ").append(name).append(", Year: ").append(to_string(year));
    }
};

int main(){
    list<Person> persons = {
        Person("Judiet", 1987),
        Person("Adath", 1966),
        Person("Zofia", 0xBABA)
    };

    for(const auto &person : persons)
        cout << stringified(person) << endl;
    return 0;
}

Wariant drugi:

#include <iostream>
#include <string>
#include <list>
#include <algorithm>
using namespace std;

struct Person{
    string name;
    unsigned year;

    operator string() const{
        return string("Name: ").append(name).append(", Year: ").append(to_string(year));
    }
};

int main(){
    list<Person> persons = {
        {"Judiet", 1987},
        {"Adath", 1966},
        {"Zofia", 0xBABA}
    };

    copy(
        begin(persons),
        end(persons),
        ostream_iterator<string>(cout, "\n")
    );
    return 0;
}
2

Po wyjściu z funkcji dod() john, mary i sue już nie żyją, więc trzymasz wskaźniki na trupy. Próby zrobienia czegokolwiek z trupami z góry są skazane na niepowodzenie.

0

Dzięki wielkie za szybką odpowiedź. Sugerując się tym co napisaliście zmieniłem trochę kod i wszystko działa. Teraz dopiero zauważyłem i zrozumiałem co za głupoty chciałem zrobić z tymi wskaźnikami. Oto mój poprawiony kod, może komuś się przyda jako przykład.

#include <iostream>
#include <list>

using namespace std;

        class Person 
        {
            string name;
            int  year;

            public:

            void print() 
            {
              cout << name << "-" << year << endl;
            }

            Person(string n=" ", int r=1):name(n),year(r){}
        }; 

       void printPerson(list< Person> listt)
       {
             for ( list< Person>::iterator it = listt.begin(); it != listt.end(); it++ )
               (it)->print();
       }

       void dod(list<Person>& listt)
       {    
             Person john ("John",25); 
             Person mary ("Mary",18); 
             Person sue ("Sue",9);
             listt.push_back(john);
             listt.push_back(mary);
             listt.push_back(sue);
       }

       int main() 
       {
           list< Person> listt;
           dod(listt);     
           printPerson(listt);

           return 0;
       }

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