visual studio 2010 - C++ Vectors and OpenGL
visual studio 2010 - C++ Vectors and OpenGL
我有一个奇怪的错误与我正在写的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;
}
最后,像这样的问题是一个例子,说明为什么提供一个演示问题的小例子很重要。第一个原因是它使我们更容易确定问题的根源。第二点是,它使您检查代码的小部分。一旦你把问题隔离开来,你就更有可能自己发现问题。
相关文章:
- Codecademy - Vectors: Operations
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 为什么C++逐位AND运算符在不同大小的操作数中表现为这样
- 为什么 Clang 不允许"and"作为函数名称?
- 位阵列上的快速AND运算
- 是否可以在 C++03 中定义'move-and-swap idiom'等效项
- BoostPython and CMake
- OpenSSL BIO and SSL_read
- Gurobi GRBModel and GRBmodel in C++
- std::visit and std::variant usage
- 是否可以跨 dll 边界返回常量引用/指向 std::vectors?
- SHBrowseForFolder with BIF_BROWSEFORCOMPUTER and SHGetPathFr
- Directx12 and keystrokes
- different between int **arr =new int [ n]; and int a[i][j]?
- C++ getenv and setenv
- Inference pytorch C++ with alexnet and cv::imread image
- Visual Studio 2019 C++ and std::filesystem
- C++,ANTLR and VECTORS
- c++ vectors and push_back
- visual studio 2010 - C++ Vectors and OpenGL