c++中对象数组
Array of objects c++
我需要在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/
- 销毁C++中动态分配的内存(数组对象)
- 数组对象的生存期是否在重用其元素存储时结束?
- 为什么顶点数组对象会导致错误?
- 具有纯虚函数和指针数组对象类型的父类的指针数组
- 这是使用构造函数初始化数组对象的最佳方法吗?
- OpenGL 顶点数组对象与 tinyobjloader
- 将数组/对象/结构列表从C#库中传递给C MFC应用程序
- C++ RapidJson 帮助反序列化数组对象
- ptrdiff_t可以表示指向同一数组对象元素的指针的所有减法吗?
- 检查成员函数是否返回临时对象或数组对象
- 为什么 std::variant 不能容纳数组对象类型,而联合可以?
- 当数组对象以函数参数传递时,为什么复制构造函数会自称
- 如何使用箭头指针打印出一类数组对象,这些对象中有多个分数
- C++17 std::shared_ptr<> 类数组对象的重载运算符 []
- 添加两个具有运算符重载的数组对象,从而导致分段错误
- opengl:两个不同的矢量可以绑定到同一个顶点数组对象吗
- 使用相同的数据填充数组对象或使用指针
- 方法用于最快的分配,并且不需要将动态大小的数组对象作为局部变量
- 如何将2d数组对象传递给c++中的函数
- ReferenceTable溢出(jni-android),数组对象释放