0

我需要在 C++ 中创建一个包含 20 个对象的数组,因为我需要全部操作它们才能在 OpenGL 中绘制它们。

我试过了:

Animal::Cat *_listCats[20];

然后我需要用坐标初始化它们。我有一个构造函数和一个 Seter

Cat(float _x, float _y) :
 _xOffSet(_x), _yOffSet(_y) {}


void CatCoordinates(float x, float y){
_xOffSet = x;
_yOffSet = y;
    }

我有一个在 OpenGL 中绘制猫的方法

void DrawCat() 
{
...do things...
 }

Cat 是命名空间 Animal 中的一个特定类,我从另一个文件调用。问题是我有 sigsevs,我不知道如何创建 20 只猫并用 cicles 有效地绘制它们。

4

3 回答 3

1

如果你想要一个对象数组20,你可以使用std::array

#include <array>

std::array<Animal::Cat, 20> listCats_; // leading _ reserved for implementation

如果没有 C++11 支持,可以使用 TR1 版本:

#include <tr1/array>

std::tr1::array<Animal::Cat, 20> listCats_;
于 2013-03-06T10:18:08.253 回答
1

该数组只是一个指针数组。它有 20 个指向Animal::Cat. 它没有给你任何Animal::Cat指向的对象,并且指针没有指向任何地方。要让它们指向实际Animal::Cat对象,您需要new Animal::Cat()为每个指针元素执行并分配它们:

for (int i = 0; i < 20; i++) {
  _listCats[i] = new Animal::Cat();
}

new表达式动态分配一个Animal::Cat对象并为您提供指向它的指针,然后您可以将其分配给数组中的指针。

但是,最好不要使用动态分配的内存。只需将其更改为:

Animal::Cat _listCats[20];

这为您提供了一系列 20Animal::Cat秒 - 您可以立即开始使用的真实物品。

或者,您可以使用 C++ 标准库中的容器更加安全。在std::array<Animal::Cat, 20>这里会很完美。

于 2013-03-06T10:18:29.757 回答
0

是否特别需要正好 20 名成员?您可以使用法线向量来存储您的对象,并让它根据需要增长。我认为不需要确切的数字。

此外,在某些编译器下,您会错过 std::array,因此 vector 可能没问题。优点是,从文件中或基于某个配置文件读取每个猫数据会更容易。

    #include <vector>

    std::vector<Animal::Cat *> cats;

    void createCats()
    {
      using namespace Animal;

      Cat *cat1 = new Cat(1, 2);
      // load image or some data maybe?
      cats.push_back(cat1);

      Cat *cat2 = new Cat(3,4);
      cats.push_back(cat2);

      // unless data loading is needed.
      cats.push_back(new Cat(5,6));
      cats.push_back(new Cat(7,8));
    }

    void DrawAllCats()
    {
      for (unsigned i=0; i< cats.size(); i++) {
        cats[i]->DrawCat();
      }
    }

    // because cats are allocated dynamically, they will not be destroyed on vector destructor.
    // use delete or smart pointers (std::auto_ptr)
    void destroyCats()
    {
      for (unsigned i=0; i<cats.size(); i++) {
        delete cats[i];
        cats[i] = NULL;
      }
    }

我建议你学习一点 C++ 对象,它与 Java 等语言不同。只有指定一个时才有引用,对象可以被复制、通过引用传递或通过指针指向。

例如,您可以使用 std::vector 猫。但是你应该定义没有参数的构造函数。见http://www.cplusplus.com/doc/tutorial/pointers/

于 2013-03-06T10:50:37.403 回答