softyaさんのいう、所持リストとアイテム情報テーブルを分けようというのはこういうイメージだと思います
アイテム情報テーブル
...
アイテム番号120: 剣
属性値a: xxx, 属性値b: yyy, ...
アイテム番号121: 薬草
属性値a: zzz, 属性値b: vvv, ...
...
所持リスト
所持アイテム0: 120
個数: X
所持アイテム1: 121
残耐久力: Y
...
所持リストはアイテム情報テーブルの添字(120, 121)と、アイテム情報テーブルには載っていない属性値だけを記録します。
以上はsoftyaさんの補足。次から僕の意見です。
アイテムの種類(剣、薬草)によって属性値が大幅に異なり、それらをいちいち構造体のメンバーにするとメンバーが増えすぎて大変です。
そこで、std::mapを用いるのは如何でしょうか。
std::map は連想配列とか辞書とか呼ばれるもので、配列の添字が整数にかぎらず何でもOKなのが特徴です。
これを使ってAtkItemを定義し直すとこうなります。(ところで、gazopってなんでしょうか)
コード:
struct AtkItem {
std::string name;
std::string detail;
int *gazop;
std::map<std::string, int> attr;
};
attrというのが std::map のインスタンスです。型が std::map<std::string, int> ですから、添字が文字列で値がintですね。
こうやって使います。
コード:
attr["power"] = 10;
int val = attr["power"];
std::mapは、指定された添字がまだ存在しないなら自動で新しい値を追加してくれますので、何も考えず attr["power"] = 10; と書けば attr の中に「power = 10」という情報が記録されます。
こうすれば、新しい属性を追加したくなったときにAtkItemの定義を修正せずに属性を追加できます。
コード:
attr["sabi"] = 0; // サビ具合を表す属性を追加
std::map を使う案、いかがでしょうか。