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
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
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.