首先,您必须决定是否要将对象放在堆栈或堆上。由于它们是对象,您可能希望它们在堆上,这意味着您的 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();
}
但是,在这种情况下,您仍然必须对向量的每个元素调用 delete,因为您为每个元素调用了 new。
ATurtle::~ATurtle() {
std::vector<hgAnimation*>::iterator i, end=myAnimations.end();
for (i=myAnimations.begin(); i!=end; ++i) {
delete (*i);
}
}