oop — несколько связанных списков для разных объектов в Stack Overflow

рассмотреть эти классы (упрощенно)

class Character
{
public:
char name[20];
char type[20];
int strength;
};

class inventoryItem
{
public:
char name[20];
};
class weapon: public inventoryItem
{
public:
int magical resistance;
};
class spell: public inventoryItem
{
public:
int magical power;
};

я написал класс для связанного списка (не разрешено использовать список STL)

class list
{
public:
struct listItem
{
listItem* objectPointer;
listItem* pnext;

}*phead;list()
{
phead=NULL;

}

bool isEmpty(){
if (!phead)
return true;
else
return false;
}
void addToBack(listItem *itemtoadd)
{
listItem *ptemp;
listItem *ppast;
listItem *pNewItem;

pNewItem=new listItem();

pNewItem->objectPointer=itemtoadd;
pNewItem->pnext=NULL;
if (phead==NULL)
phead=itemtoadd;
else
{
ptemp=phead;
while(ptemp)
{
ptemp= ptemp->pnext;

}
ptemp->pnext=itemtoadd;

}

}

};

Я много сократил это, но мой вопрос, есть ли простой способ создать связанные списки для всех этих, используя тот же класс списка? или я трачу свое время?

каждый раз, когда я пытался это сделать, я не могу преобразовать указатель из типа «оружие» в тип «listitem»
Мне нужен список персонажей и список каждого оружия или заклинания для этого персонажа
Я все еще начинающий с ООП и указателями,
у меня есть программа, которая сейчас компилируется, и у меня есть список работающих символов, однако этот список не управляется классом, которым он управляет в некоторых других функциях, я надеюсь, что один класс сможет справиться со всем этим, может кто-нибудь помочь объясни мне это?

0

Решение

Взгляни на Шаблоны C ++. Используя шаблоны, вы можете иметь один класс списка с точки зрения чтения / записи кода, но вы можете иметь список оружия, список предметов или список чего-либо еще без необходимости писать классы WeaponsList, ItemsList и SomethingElseList отдельно.

1

Другие решения

Простой ответ — сделать это

struct listItem
{
void* objectPointer;
listItem* pnext;

}*phead;

Пустой указатель позволит вам сохранить указатель на что-либо. Конечно, тогда вы полностью должны убедиться, что не потеряете отслеживание того, на какой объект вы указываете. Так что такой подход рискован. Более безопасный подход — шаблоны, как было предложено.

1

Вы можете использовать:

enum item
{
WEAPON,SPELL
}

class list {
public:
struct listItem {
union {
weapon *weaponPointer;
spell *spellPointer
} object;
item objType;
listItem* pnext;

}*phead;

однако выгода заключается в том, что вам нужно получить доступ к члену типа, чтобы определить, к какому типу элемента вы обращаетесь.

0
По вопросам рекламы [email protected]