我在C++中有一个非常简单的openGL程序。我已经制作了一个Sphere对象,该对象只是绘制一个球体。我想有一个全局变量,它在main()中实例化,即sphere = Sphere(radius,etc),然后在draw()中绘制,即sphere.draw(),但是C++不允许我这样做。另外,如果我在main()中具有对球体的引用,则无法将其传递给draw函数,因为我自己还没有定义draw函数。这个伪代码可能会更好地解释它:

include "sphere.h"
Sphere sphere;   <- can't do this for some reason

draw()
{
    ...
    sphere.draw()
}

main()
{
    glutDisplayFunc(draw)
    sphere = Sphere(radius, etc)
}

我敢肯定这很简单,但是对于Google来说,找到答案并相信我已经尝试过是一件困难的事情。我知道使用全局变量是“不好的”,但似乎没有其他选择。我最终希望拥有另一个名为“世界”的类,其中包含对球体的引用和绘制函数,但是另一个问题是我不知道如何将glutDisplayFunc重定向到类函数。我尝试了glutDisplayFunc(sphere.draw),显然这是错误的。

编译器错误为:
../src/Cplanets.cpp:9:错误:没有匹配的函数可以调用“Sphere::Sphere()”
../src/Sphere.cpp:28:注意:候选对象为:Sphere::Sphere(std::string,float,float,float)
../src/Sphere.cpp:13:注意:Sphere::Sphere(const Sphere&)

球类是:
/*
 * Sphere.cpp
 *
 *  Created on: 3 Mar 2011
 *      Author: will
 */

#include <GL/glut.h>
#include <string>

using namespace std;

class Sphere {

public:

    string name;
    float radius;
    float orbit_distance;
    float orbit_time;

    static const int SLICES = 30;
    static const int STACKS = 30;

    GLUquadricObj *sphere;


    Sphere(string n, float r, float od, float ot)

    {

        name = n;
        radius = r;
        orbit_distance = od;
        orbit_time = ot;
        sphere = gluNewQuadric();

}

void draw()
{
    //gluSphere(self.sphere, self.radius, Sphere.SLICES, Sphere.STACKS)
    gluSphere(sphere, radius, SLICES, STACKS);
}

};

最佳答案

您正在处理两个构造函数调用:

Sphere sphere;

这将尝试调用未声明的默认构造函数Sphere::Sphere()
sphere = Sphere(radius, etc);

这将调用构造函数并接受两个参数,我认为这是唯一提供的参数。

像这样做:
include "sphere.h"
Sphere *sphere;

draw()
{
    ...
    sphere->draw();
}

main()
{
    sphere = new Sphere(radius, etc);
    glutDisplayFunc(draw);
}

关于c++ - 一个关于opengl,c++和对象的非常简单的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5195897/

10-10 16:53