关于opengl,c ++和对象的一个​​非常简单的问题

时间:2011-03-04 15:39:31

标签: c++ opengl

我在C ++中有一个非常简单的openGL程序。我制作了一个Sphere对象,它只是绘制一个球体。我想要一个全局变量,它在main()中实例化,即sphere = Sphere(半径等),然后在draw()中绘制,即sphere.draw(),但C ++不会让我。或者,如果我在main()中引用了球体,那么我无法将它传递给draw函数,因为我自己没有定义绘制函数。这个伪代码可能会更好地解释它:

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

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

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

我确信这很简单,但谷歌找到答案很困难,相信我已经尝试过了。我知道使用全局变量是“坏”但似乎没有其他选择。我最终希望有另一个名为'world'的类,它包含对spheres和draw函数的引用,但另一个问题是我不知道如何将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&amp;)

球体类是:

/*
 * 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);
}

};

2 个答案:

答案 0 :(得分:5)

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

Sphere sphere;

这会尝试调用未声明的默认构造函数Sphere::Sphere()

sphere = Sphere(radius, etc);

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

这样做:

include "sphere.h"
Sphere *sphere;

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

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

答案 1 :(得分:1)

Sphere类已重写默认构造函数。如果在类定义中未指定构造函数,则编译器会自动提供默认构造函数(即Sphere::Sphere())。由于Sphere类使用带有四个参数的构造函数覆盖它,因此类本身的工作是指定默认值。