c++中对象数组

Array of objects c++

本文关键字:数组 对象 c++      更新时间:2023-10-16

我需要在c++中创建一个包含20个对象的数组,因为我需要操作它们以便在OpenGL中绘制它们。

我试过:

Animal::Cat *_listCats[20];

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

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

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

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

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

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

如果你想要一个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_;

该数组只是一个指针数组。它有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];

这给了你一个包含20个Animal::Cat s的数组——你可以马上开始使用的真正的对象。

或者,使用c++标准库中的容器会更安全。std::array<Animal::Cat, 20>在这里是完美的。

是否需要刚好20个成员?您可以使用法向量来存储对象,并根据需要让它增长。我看不需要确切的数字。

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

    #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 cats。但是你应该定义不带参数的构造函数。见http://www.cplusplus.com/doc/tutorial/pointers/