У меня есть проблема, которая раздражала меня некоторое время, и я еще не нашел решение. Я хотел бы создать контейнерный класс, который хранит объекты и сортирует их в соответствии с ОДНОЙ из значений их переменных-членов. Поэтому, если у меня есть класс студентов (с переменной члена int studentID), я хочу сохранить их в своем классе Container в соответствии с их значением studentID в порядке возрастания. Я сделал контейнерный класс шаблонным классом, чтобы я мог использовать его в любом своем проекте.
Моя проблема с моим классом Container: Я не могу хранить указатели объектов (например, объектов Student). Точнее, проблема в том, что я не могу сохранить ссылку (?) На переменную-член объекта (например, ссылку / указатель на переменную studentID Студента).
Эта проблема раздражала меня целую вечность, и любая информация или советы будут высоко оценены. Есть ли способ сделать мой указатель класса контейнера ниже указателей на переменные-члены объектов? Есть ли другой способ создания контейнера объектов, который можно отсортировать по переменным-членам?
#include <iostream>
using namespace std;
template <typename Object, typename dataType>
class Collection
{
public:
Collection( dataType Object::*nMemberVariable )
{
memberVariable = nMemberVariable;
}
bool store( Object* o )
{
// check that o is not a NULL pointer & not already present in maps
if ( o==NULL || instanceVarMap.find(o->*memberVariable) != instanceVarMap.end() )
{
return false;
}
instanceVarMap.insert( o->*memberVariable, o );
return true;
}
private:
dataType Object::* memberVariable;
std::map <dataType, Object*> instanceVarMap;
};
struct FoodItem
{
unsigned int ID;
string name;
double price;
};
int main()
{
// I am attempting to store a pointer to an objects member variable
// this is so I can create a custom container class(like a map or vector) that
// sorts its contents (which are FoodItem objects) according to their member variable values
// so a container could sort all its elements according to a FoodItems ID value or name value
Collection <FoodItem*> foodCol( &FoodItem::name );
string nNames[] = {"a", "b", "c", "d"};
double nPrices[] = {1.1, 2.2, 3.3, 4.4};
for (int i=0; i<4; i++)
{
FoodItem *f = new FoodItem() { i, nNames[i], nPrices[i] };
foodCol.store( f );
}
// Note storing an ACTUAL object is possible with this class
Collection <FoodItem*> foodCol( &FoodItem::name );
FoodItem f( 1, "a", 4 );
foodCol.store( f );
system("PAUSE");
return 0;
}