Професионална програма
Loading...
+ Нов въпрос
rado_niko avatar rado_niko 5 Точки

Запазване на различни класове в една колекци?!

Опитвам се да работя с една колекция, в която да пазя различни класове. Но имам необяснимо за мен държане.

Малко дълъг код, но....

#include <sstream>
#include <typeinfo>
#include <map>
#include <iostream>

using namespace std;

enum CourceType { Java, CSharp };

class Person
{
public:
	Person() {};
	Person(int id, string personName) : personId(id), name(personName), courcesCount(1){};

	virtual ~Person() {}

	int getCourcesCount() const
	{
		return courcesCount;
	}

	string getName() const
	{
		return name;
	}

	virtual string toString()
	{
		ostringstream result;
		result 		
			<< "Person id: " << personId << endl
			<< "Person name: " << getName() << endl
			<< "All cources number: " << getCourcesCount() << endl;

		return result.str();
	}

protected:
	int personId;
	string name;
	CourceType currentCource;
	int courcesCount = 0;
};

class Student : public Person
{
public:
	Student(int id, string name, int points) : Person(id, name), points(points) {};
	
	string toString() override
	{
		ostringstream result;
		result
			<< typeid(this).name() << endl
			<< Person::toString()
			<< "Average points: " << points / getCourcesCount() << endl;

		return result.str();
	}
private:
	int points;
};

typedef map<int, Person*> Database;
Database myDB;
int counter = 0;

Person* getPersonById(int id)
{
	Database::iterator it = myDB.find(id);
	if (it != myDB.end())
	{
		return it->second;
	}
	
	return nullptr;
}

int main()
{
	Person * p1;
	Student s(++counter,"Test", 100);
	p1 = &s;

	myDB[counter] = p1;
	myDB[++counter] = &Student(counter,"Test1", 80);

	int searchingKey = 2;
	Person * resultPerson = getPersonById(searchingKey);

	if (resultPerson != nullptr)
	{
		cout << resultPerson->toString();
	}
	else
	{
		cout << "No person found with key: " << searchingKey << endl;
	}
}

Когато използвам  myDB[++counter] = &Student(counter,"Test1", 80);  не се печата името, докато ако изполвам 

Person * p1;
Student s(++counter,"Test", 100);
p1 = &s;
myDB[counter] = p1;

всичко е ОК. Не мога да схвана защо ?!?

Тагове:
0
C++ Programming
lubomirjurukov avatar lubomirjurukov 63 Точки
Best Answer

Проблема идва от там че myDB[++counter] = &Student(counter,"Test1", 80); вика copy constructor след това &Student(counter,"Test1", 80) автоматично му се вика деструктора

0
16/06/2016 20:11:39
Filkolev avatar Filkolev 4482 Точки

На първо четене  counter е различно, може би не взимаш правилния елемент.

0
rado_niko avatar rado_niko 5 Точки

Създавам два обекта:

P1 с Id = 1

&Student(counter,"Test1", 80) с Id = 2

getPersonById(1) взима обекта с име = Test и id = 1 и го печата нормално. getPersonById(2) взима обекта с име = Test1 и id = 2 и когато го изпечата не може да вземе само името на обекта. Единствената разлика е как създавам и добавям в колекцията обектите. Единият е на 4 реда, другият на един. Странно!

 

 

0
rado_niko avatar rado_niko 5 Точки

Намерих решение :

typedef map<int, shared_ptr<Person>> Database;
	Database myDB;
	int counter = 0;

	shared_ptr<Person> temp = std::make_shared<Student>(counter, "Test1", 80);
	myDB[++counter] = temp;

	int searchingKey = 1;
	shared_ptr<Person> resultPerson = getPersonById(searchingKey);

	if (resultPerson != nullptr)
	{
		cout << resultPerson->toString();
	}
	else
	{
		cout << "No person found with key: " << searchingKey << endl;
	}

Неволятааа....неволятааа smiley

 

1