创建并遍历一个模板化对象数组
Create and Iterate through an array of templated objects
我创建了一个C++模板,定义不同的数据类型2D点,作为在OpenGL程序中重新学习C++的任务。
template <typename T>
class Point2D {
public:
Point2D(const T& x, const T& y) {
_data[0] = x;
_data[1] = y;
}
const T & x() { return _data[0]; }
const T & y() { return _data[1]; }
private:
T _data[2];
};
我可以创建Point2D的多个命名实例并存储值,并使用它们绘制基本形状
Point2D <GLdouble> c0( 0.5, 0.5);
Point2D <GLdouble> c1(-0.5, 0.5);
然后画一个像我访问的点的值。
glBegin(GL_LINES);
glVertex2d(c0.x(), c0.y());
glVertex2d(c1.x(), c1.y());
glEnd();
但是,我想创建一个相同模板类型(例如double)的Points2D对象数组来表示一个形状。
我如何创建模板化Point2D的数组来表示更复杂的对象,我可以在其中绘制模板化对象的循环数组。
glBegin(GL_POLYGON);
for (k = 0; k < 4; k++) {
glVertex2d( ????? [i].x(), ????? [i].x());
}
glEnd();
有人能给我提个办法吗?
感谢
Stuart
要存储多个点,请使用C数组或更好的std::vector容器,然后在循环中枚举点,并为每个调用glVertex2d
#include <vector>
std::vector< Point2D <GLdouble> > points = {Point2D<GLdouble>(0.5, 0.5),
Point2D<GLdouble>(-0.5, 0.5)};
size_t size = points.size();
glBegin(GL_LINES);
for (size_t i = 0; i < size; ++i)
{
glVertex2d( points[i].x(), points[i].x());
}
glEnd();
但如果使用OpenGL 1.1或更高版本,最好使用顶点数组缓冲区,而不是单独的glVertex调用。尝试通过添加将ponter返回到firts数组元素的方法来修改您的点类
template <typename T>
class Point2D {
public:
Point2D(const T& x, const T& y) {
_data[0] = x;
_data[1] = y;
}
const T & x() { return _data[0]; }
const T & y() { return _data[1]; }
T* data() const { return &_data[0]; }
private:
T _data[2];
};
然后将点添加到容器中,创建一次顶点缓冲区,然后绑定它并调用函数glVertexPointer。要绘制元素,请使用glDrawArrays
GLuint bufferId;
glGenBuffers(1, &bufferId);
std::vector< Point2D <GLdouble> > points = {Point2D<GLdouble>(0.5, 0.5),
Point2D<GLdouble>(-0.5, 0.5)};
size_t size = points.size();
glBindBuffer(GL_ARRAY_BUFFER, bufferId);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_DOUBLE, 0, (const GLvoid *)points[0].data()); // <= 2 - X and Y
glDrawArrays(GL_LINES, 0, points.size());
为什么不使用std::矢量?类似于:
#include <iostream>
#include <vector>
using namespace std;
template <typename T>
class Point2D {
public:
Point2D(const T& x = T(), const T& y = T()) {
_data[0] = x; _data[1] = y;
}
const T & x() { return _data[0]; }
const T & y() { return _data[1]; }
private:
T _data[2];
};
int main()
{
vector<Point2D<double> > polygon(4);
for(int i=0;i < polygon.size(); ++i)
cout << "Point " << i << " = (" << polygon[i].x() << "," << polygon[i].y() << ")" << endl;
return 0;
}
相关文章:
- 将对象数组的引用传递给函数
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 类对象数组的问题会导致崩溃
- Arduino C++在构造函数中用参数声明对象数组
- 使用对象数组对 SFML 进行动画处理
- C++ 对象数组堆栈溢出
- 如何将对象数组作为参数传递给模板
- 使用向量初始化参数化构造函数的对象数组
- 如何初始化对象数组?
- C++创建对象数组
- 在对象数组中搜索字符串并返回相应值的函数
- 有没有办法使用该类的构造函数初始化另一个类的私有部分内的对象数组?
- 如何在运行时在对象数组中动态追加新对象C++并打印它们
- 为什么我在声明对象数组时不能使用 -> 运算符?
- 编译时生成应在构造函数中创建的非 constexpr 对象数组
- 使用 C++ 创建对象数组
- 对象数组打印空白字符串
- 重载运算符 [] 用于从对象数组中给出特定索引
- 如何在 C++ 中使用提升属性树从 JSON 文件中读取对象数组