2013-03-06 94 views
0

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

我已经试过:

Animal::Cat *_listCats[20]; 

然后我需要坐标inicialize他们。 我有一个构造函数和一个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... 
} 

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

+2

这是一个包含20个Cat指针的数组,而不是一个包含20个Cat对象的数组。 – us2012 2013-03-06 10:16:15

+0

那么,我应该删除*? – Elsendion 2013-03-06 10:17:45

回答

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_; 
1

该阵列是只是指针的数组。它有20个指向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秒的阵列 - 真正的对象就可以开始使用的时候了。

或者,您可以通过使用C++标准库中的容器来更安全。 std::array<Animal::Cat, 20>会在这里被吸收。

0

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

另外,在一些编译器中,你会错过std :: array,所以向量可能没问题。 优点是,从文件或基于某个配置文件读取每个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/