c++动态二维数组不使用默认构造函数

标签 c++ arrays dynamic constructor default

我遇到了一个超出我知识范围的问题。我正在处理一个 HGE 项目,但这是一个 c++ 问题,而不是 HGE 引擎本身。

问题: 我想在 5 只不同的海龟上创建一个包含 3 种不同动画的二维数组。但是,我需要在 HGE 中使用这样的构造函数; turtleAnim[i] = new hgeAnimation( turtleTexture, 6, 6, 0, 0, 110, 78 )

但是我不知道怎么做! interwebz 上的所有示例都像处理默认构造函数一样处理该问题。像这样:

在类里面:

#define     TURTLECOUNT     5
#define     TURTLEANIMATIONS    3

private:
hgeAnimation** turtleAnim;

在.cpp中

turtleAnim= new hgeAnimation*[TURTLECOUNT];

for(int i=0; i<TURTLECOUNT; i++)
{
    turtleAnim[i]= new hgeAnimation[TURTLEANIMATIONS]; // Uses default constructor. I don't want that cuz it doesn't exists.
    turtleAnim[i]->Play();
}

最佳答案

首先,你必须决定你的对象是在栈上还是堆上。由于它们是对象,您可能希望将它们放在堆上,这意味着您的 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();
}

不过,在这种情况下,您仍然需要对 vector 的每个元素调用 delete,因为您为每个元素都调用了 new。

ATurtle::~ATurtle() {
   std::vector<hgAnimation*>::iterator i, end=myAnimations.end();
   for (i=myAnimations.begin(); i!=end; ++i) {
       delete (*i);
   }       
}

关于c++动态二维数组不使用默认构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16428048/

相关文章:

c++ - 作为键的 vector 如何在 C++ 内部工作?

c++ - 终止 DebugActiveProcess 或其他调试例程

c++ - 使用指向 "this"的 volatile 指针的此模式的目的是什么?

c++ - 将变量传递给 WIN32 API LPCWSTR?

在共享内存 c 中创建 char 的二维数组

python - 同时并行读取 numpy 数组

javascript - JS表单-动态填充下拉列表-多选、表单填写

c++ - 动态创建一个新的 protobuf 消息

ios - 通过对象中包含的字典数组过滤对象数组

javascript - 将数组嵌入对象传递到动态表单的 ember.js 路由时遇到问题