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