В настоящий момент я использую вектор для хранения указателей на объект каждый раз, когда он создается, но это выглядит немного глупо. Наверное, есть способ получше, но я его не нашел.
What I'm doing: Example usage:
Проблема :
Я, вероятно, излишне усложняю вещи (то, что я делаю много), поэтому пояснение того, как должно быть сделано что-то вроде этого , было бы очень хорошо.
Подробная информация: (на случай, если я был слишком расплывчатым)
Приведенный ниже пример должен напоминать календарь, который может содержать определенные элементы (RecPayments), и эти элементы сгруппированы по дате (RecPaymentsStack).
struct RecPayments
{
std::string name;
Date* date;
float cost;
};
struct RecPaymentsStack
{
Date* stackDate; //This stack's date
RecPayments * thePaymentItem; //Hold pointer to the actual item
};
И вот как я их сейчас храню.
std::vector<RecPaymentsStack*> RecPaymentsVector; //This vector will hold pointers to all the Recurring Payments
void addRecurring(std::string theDate,std::string theName,float theCost)
{
//New recurring payment
RecPayments * newPaymentItem = new RecPayments;
//Set recurring payment properties
newPaymentItem->name = theName;
newPaymentItem->date = new Date(stringToChar(theDate));
newPaymentItem->cost = theCost;
//Add recurring payment to stack
RecPaymentsStack * addToStack = new RecPaymentsStack;
addToStack->stackDate = new Date(stringToChar(theDate));
addToStack->thePaymentItem = newPaymentItem;
//Add pointer to RecPaymentsStack to vector
RecPaymentsVector.push_back(addToStack);
}
Итак, чтобы получить элементы для заданной даты, я просматриваю все указатели в векторе, чтобы увидеть, соответствует ли свойство "stackDate" запрошенная дата, и если это так, я использую свойство «thePaymentItem», чтобы показать фактический элемент.
void getItemsNow(Date requestedDate)
{
std::cout << "Showing Dates for " << requestedDate << std::endl;
unsigned int i;
for(i=0;i<RecPaymentsVector.size();i++) //Go over all items in vector
{
Date dateInVector(*RecPaymentsVector[i]->stackDate); //Get the date from the vector
if(dateInVector == requestedDate) //See if Date matches what the user requested
{
//Date matched, show user the item properties.
std::cout << "Date: " << dateInVector <<
" has name: " << RecPaymentsVector[i]->thePaymentItem->name <<
" and price " << RecPaymentsVector[i]->thePaymentItem->cost <<
std::endl;
}
}
}
3 проблемы с этим:
Таким образом, общая идея заключается в том, что я в конечном итоге делаю что-то вроде (глупый пример)
for each RecPaymentsStack->stackDate //For each unique Date, show it's children items.
{
cout << "The Date is " CurrentRecPaymentsStack->stackDate and it holds the following items:
for each CurrentRecPaymentsStack->thePaymentItem //This would now be an array of pointers
{
cout << "item name " CurrentRecPaymentsStack->thePaymentItem->name << " with cost " << CurrentRecPaymentsStack->thePaymentItem->cost << endl;
}
}
Что в основном перебирает все уникальные объекты «RecPaymentsStack» (уникальные, определяемые его свойством «Дата»), и для каждой даты он затем покажет, что это «потомки» из структуры RecPayments.
И должен быть какой-то способ поиска определенной даты без необходимости перебирать все доступные даты.