嘿伙计们我有一些课
//
// 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
但是现在我的编译器告诉我“Projects / ETH / ETH / raytracer / raytracer / renderGUI.h:19:5:未知类型名称'渲染器';你的意思是'sfg :: Renderer'?”在第19和31行甚至在我看来它应该找到我的班级......
任何人都可以给我一些提示吗? 提前谢谢!
和平
答案 0 :(得分:0)
没有看到你的scene.h
头文件,我猜测循环包含。 renderGUI.h
头文件包含render.h
头文件(可能是间接的)包含renderGUI.h
。
在这种情况下,解决起来很简单:不要在render.h
中包含renderGUI.h
,只声明Renderer
类。
所以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
指针,所以编译器知道存在名为{{1的类的存在就足够了,编译器不需要知道有关该类的更多信息。
当然,在您实际使用Renderer
类的实例(或指向实例的指针)的源文件中,您需要完整的定义,因此您应该包含头文件。