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