繁体   English   中英

对象数组c ++

[英]Array of objects c++

我需要在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中绘制Cat

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

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

如果你想要一个包含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/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM