[英]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.