まず、オブジェクトをスタックまたはヒープのどちらに配置するかを決定する必要があります。これらはオブジェクトであるため、おそらくヒープに配置する必要があります。つまり、2D 配列には 3 つの星があり、次のようにアニメーションにアクセスします。
hgAnimation* theSecondAnimOnTheFourthTurtle = turtleAnim[4][2];
theSecondAnimOnTheFourthTurtle->DoSomething();
それが必要な場合は、最初にポインターのマトリックスを作成します。
hgeAnimation*** turtleAnim = new hgeAnimation**[TURTLECOUNT];
その後、タートルをループできます。タートルごとに、アニメーションへのポインターの配列を作成します。その配列の各要素に対して、アニメーション自体を作成します。
for (int turt=0; turt<TURTLECOUNT; ++turt) {
turtleAnim[turt] = new hgeAnimation*[TURTLEANIMATIONS];
for (int ani=0; ani<TURTLEANIMATIONS; ++ani) {
turtleAnim[turt][ani] = new hgeAnimation(parameter1, par2, par3);
}
}
それが難しいように見える場合は、すべての配列を削除するのも面倒です。
for (int turt=0; turt<TURTLECOUNT; ++turt) {
for (int ani=0; ani<TURTLEANIMATIONS; ++ani) {
delete turtleAnim[turt][ani];
}
delete[] turtleAnim[turt];
}
delete[] turtleAnim;
これがトリッキーであるという事実は、おそらくもっと簡単な設計方法があることを示す良い兆候です。
次のようなメンバーを持つタートル クラスはどうでしょうか。
class ATurtle {
private:
std::vector<hgeAnimation*> myAnimations;
次に、クラスのコンストラクターで、アニメーションを作成するために必要なことを何でも行うことができます。
ATurtle::ATurtle(par1, par2, par3) {
myAnimations.push_back( new hgeAnimation(par1, x, y) );
myAnimations.push_back( new hgeAnimation(par2, z, a) );
myAnimations.push_back( new hgeAnimation(par3, b, c) );
}
そうすれば、単一の配列でタートルを作成できます。
ATurtle* turtles[TURTLECOUNT];
for (int t=0; t<TURTLECOUNT; ++t) {
turtles[t] = new ATurtle(par1, par2);
}
タートル クラスでは、次のようにアニメーションにアクセスします。
(*(myAnimations.at(1)))->DoSomething();
また
std::vector<hgAnimation*>::iterator i, end=myAnimations.end();
for (i=myAnimations.begin(); i!=end; ++i) {
(*i)->DoSomething();
}
ただし、すべての要素に対して new を呼び出したので、この場合でも、ベクトルの各要素に対して delete を呼び出す必要があります。
ATurtle::~ATurtle() {
std::vector<hgAnimation*>::iterator i, end=myAnimations.end();
for (i=myAnimations.begin(); i!=end; ++i) {
delete (*i);
}
}