XCode & Clang не распознают мой класс, несмотря на правильное включение

0

Привет, ребята, у меня есть класс

//
//  renderGUI.h
//  raytracer
//
//  Created by Noah on 24/01/14.
//  Copyright (c) 2014 syx. All rights reserved.
//

#ifndef raytracer_renderGUI
#define raytracer_renderGUI

#include <SFML/Graphics.hpp>
#include <SFGUI/SFGUI.hpp>
#include <renderer.h>

class RenderGUI{

private:
    Renderer* renderer;
    std::shared_ptr<sfg::Window> window;
    std::shared_ptr<sfg::Button> render;
    std::shared_ptr<sfg::Button> abort;
    std::shared_ptr<sfg::ProgressBar> progress;
    std::shared_ptr<sfg::CheckButton> antialiasing;
    void OnComboSelect();
    void startRenderThread();
    void endRenderThread();
    unsigned int renderButtonEvent;

public:
    RenderGUI(Renderer* renderer);
    sfg::Window::Ptr getWindow();
    void update();
    void updateProgressBar(double progress);
    void renderScene();
};


#endif

и вот renderer.h:

//
//  renderer.h
//  raytracer
//
//  Created by Noah on 31/01/14.
//  Copyright (c) 2014 syx. All rights reserved.
//

#ifndef raytracer_renderer
#define raytracer_renderer

#include <scene.h>
#include <thread>

class Renderer{

private:
    sf::Texture* texture;
    sf::Uint8* canvas;
    Vector resolution;

    Scene* scene;
    MaterialManager* materialManager;
    Camera* camera;

    bool canvasReady;
    bool antiAliasing;
    bool canRender;

    double progress;
    std::thread renderThread;

    Color traceRay (const Ray& ray, double, int iter) const;

    void setPixel(int x, int y, Color c);

public:
    Renderer(Scene *scene, MaterialManager *materialManager, Vector resolution, bool antiAliasing);

    sf::Texture* getTexture();
    sf::Uint8* readCanvas();
    double epsilon;
    void update();
    void render();
    void useAntiAliasing(bool antiAliasing);
    bool useAntiAliasing();
    bool isCanvasReady();
    void chooseCamera(Camera* camera);
    void startRenderThread();
    void endRenderThread();
    double getProgress() const;
};

#endif

Но теперь мой компилятор говорит мне "Проекты/ETH/ETH/raytracer/raytracer/renderGUI.h: 19: 5: Неизвестное имя типа" Renderer ", вы имели в виду" sfg :: Renderer "?" на линии 19 и 31 даже, по-моему, он должен найти мой класс...

Может ли кто-нибудь дать мне какой-то намек? Заранее спасибо!

мир

  • 0
    Может быть круговой включить? Что scene.h себя scene.h ?
Теги:
clang
xcode

1 ответ

0
Лучший ответ

Не видя заголовок файла scene.h я предполагаю, что это круговое включение. renderGUI.h заголовка renderGUI.h включает render.h заголовка render.h который (возможно, косвенно) включает renderGUI.h.

В этом случае это довольно просто решить: не включайте render.h в renderGUI.h, объявите только класс Renderer.

Таким renderGUI.h файл renderGUI.h выглядит примерно так:

#ifndef raytracer_renderGUI
#define raytracer_renderGUI

#include <SFML/Graphics.hpp>
#include <SFGUI/SFGUI.hpp>

class Renderer;

class RenderGUI{

private:
    Renderer* renderer;
    ...
};

#endif

Причина этого заключается в том, что вы используете только указатель Renderer в определении класса RenderGUI, поэтому достаточно, чтобы компилятор знал, что существует класс, существующий с именем Renderer, компилятору не нужно знать больше информации об этом класс.

Конечно, в исходном файле, где вы действительно работаете с экземплярами (или указателями на экземпляры) класса Renderer вам нужно полное определение, поэтому там вы должны включить заголовочный файл.

  • 0
    Большое спасибо, работает как шарм! Чего я не понимаю, так это того, что это циклическое включение блокирует меня ... Я имею в виду, что я могу включить его в renderer.cpp без проблем, но renderer.cpp также содержит renderer.h, так почему он не конфликтует и там? ?
  • 0
    Единственный вопрос, который у меня есть: кто за это проголосовал и почему? (+1 от меня)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню