очень простой вопрос об opengl, c ++ и объектах - PullRequest
1 голос
/ 04 марта 2011

У меня есть очень простая программа openGL на C ++. Я сделал объект Sphere, который просто рисует сферу. Я хочу иметь глобальную переменную, которая создается в main (), то есть сфера = сфера (радиус и т. Д.), А затем рисуется в draw (), т.е. сфера .draw (), но C ++ не позволяет мне. В качестве альтернативы, если у меня есть ссылка на сферу в main (), я не могу передать ее функции рисования, потому что я сам не определил функцию рисования. Этот псевдокод может объяснить это немного лучше:

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 (phere.draw), очевидно, это ужасно неправильно.

Ошибка компилятора: ../src/Cplanets.cpp:9: ошибка: нет подходящей функции для вызова Sphere :: Sphere () ’ ../src/Sphere.cpp:28: примечание: кандидаты: Sphere :: Sphere (std :: string, float, float, float) ../src/Sphere.cpp:13: note: Сфера :: Сфера (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);
}

};

Ответы [ 2 ]

5 голосов
/ 04 марта 2011

Вы имеете дело с двумя вызовами конструктора:

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 голос
/ 04 марта 2011

Класс Sphere переопределил конструктор по умолчанию.Если в определении класса не указан конструктор, компилятор автоматически предоставляет конструктор по умолчанию (т. Е. Sphere::Sphere()).Так как класс Sphere переопределил его с помощью конструктора, принимающего четыре аргумента, задание по умолчанию задается самим классом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...