0

これらのクラスを検討してください(簡略化)

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;

}

}

};

私はこれを大幅に削減しましたが、私の質問は、同じリストクラスを使用してこれらすべてのリンクリストを作成する簡単な方法はありますか?または私は自分の時間を無駄にしていますか?

ポインターを「weapon」タイプから「listitem」タイプに変換できないようにするたびに
、キャラクターのリストと、そのキャラクターの各武器またはスペルのリストが必要
です。私はまだOOPとポインター、プログラムの初心者です。私は今コンパイルし、動作している文字のリストを持っていますが、リストは他のいくつかの関数内で管理されているクラスによって管理されていません、私は1つのクラスがそれをすべて処理する方法があることを望んでいます、誰かがそれを説明するのを手伝ってもらえますか私に ?

4

3 に答える 3

1

C++テンプレートを見てください。テンプレートを使用すると、コードの読み取り/書き込みに関して1つのリストクラスを作成できますが、WeaponsList、ItemsList、SomethingElseListクラスを個別に作成しなくても、武器のリスト、アイテムのリスト、またはその他のリストを作成できます。

于 2013-03-24T11:19:17.630 に答える
1

簡単な答えはこれを行うことです

struct listItem
{
    void* objectPointer;
    listItem* pnext;

}*phead;

voidポインタを使用すると、任意のポインタを格納できます。もちろん、あなたが指しているオブジェクトの種類を見失わないようにするのは完全にあなた次第です。したがって、このアプローチにはリスクが伴います。より安全なアプローチは、提案されているテンプレートです。

于 2013-03-24T11:21:16.320 に答える
0

あなたが使用することができます:

enum item
{
    WEAPON,SPELL
}

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

    }*phead;

ただし、問題は、アクセスしているアイテムのタイプを判別するためにタイプメンバーにアクセスする必要があることです。

于 2013-03-24T11:25:47.690 に答える