visual studio 2010 - C++ Vectors and OpenGL

visual studio 2010 - C++ Vectors and OpenGL

本文关键字:Vectors and OpenGL C++ studio 2010 visual      更新时间:2023-10-16

我有一个奇怪的错误与我正在写的OpenGL代码。作为测试,我创建了一个球体矢量,并使用push_back(s1)。我在向量上加上了多个球体。然而,当我运行程序时,它只画出最近被推入向量的球体。

#include "Sphere.h";
#include <iostream>;
#include <vector>;
using namespae std;
vector<Sphere> spheres;
Sphere s1 = Sphere(1.0, "One");
Sphere s2 = Sphere(2.0, "Two");
Sphere s3 = Sphere(3.0, "Three");
void init(void) {
    spheres.push_back(s1);
    spheres.push_back(s2);
    spheres.push_back(s3);
    for each(Sphere s in spheres) {
        cout << s.getName() << "n";
    }
}
// OTHER CODE OMMITED
void display(void) {
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 1.0, 0.0);
    glPushMatrix();
    for each(Sphere in s) {
        s.draw();
    }
    glPopMatrix();
}

显然有一个main方法在那里所有的GL东西都被设置,我知道那里没有问题。

所以球体有自己的绘制方法。现在有趣的部分是,它在控制台中输出:

Three
Three
Three

,然后在屏幕上画3次。

所以我的问题是:为什么它只绘制向量中的最后一项三次?我也尝试过使用迭代器和普通的for循环,但它们都产生相同的结果。

有人知道吗?

编辑

getName()功能:

string Sphere::getName() {
    return name;
}

vector迭代器:

vector<Sphere>::iterator it;
void display() {
    for(it = planets.begin(); it != planets.end(); ++it) {
        it->draw();
    }
}

在球体中绘制代码:

GLdouble r = 0.0;
GLfloat X = 0.0f;
string name = " ";
Sphere::Sphere(GLdouble ra, GLfloat x, string n)
{
    r = ra;
    X = pos;
    name = n;
}

Sphere::~Sphere(void)
{
}
void Sphere::draw(void) 
{
    glutSolidSphere(r, 10, 8);
    glTranslatef(X, 0.0, 0.0);
}
string Sphere::getName(void)
{
    return name;
}

问题似乎是您在Sphere.cpp中定义了3个全局变量,而不是类成员变量。因此,每次构造函数运行时,它都会覆盖前面的值,并且您只看到最后构造的对象。

解决方案是将它们声明为成员。

在Sphere.h中,在Sphere的类定义中放入

class Sphere { 
   // constructors, your current functions, and so on...
  private:
   GLdouble r;
   GLfloat X;
   string name;
}

最后,像这样的问题是一个例子,说明为什么提供一个演示问题的小例子很重要。第一个原因是它使我们更容易确定问题的根源。第二点是,它使您检查代码的小部分。一旦你把问题隔离开来,你就更有可能自己发现问题。