我正在尝试学习C ++并遇到编译错误,我无法弄清楚如何修复。我确信这是一件很简单的事情,我已经错过了,但我根本无法解决这个问题。
Display.cpp:21:17: error: ‘Renderer’ was not declared in this scope
std::shared_ptr<Renderer> Display::CreateRenderer(std::shared_ptr<Window> windo
^
Renderer.h文件包含在Display.h文件中,因此根据我的理解,它应该提取它(它不应该是前向声明的,因为#include有效吗?) 。我尝试过提供完整的命名空间,但没有效果。令我困惑的是我包含的另一个文件(Window.h)工作正常,如果我删除了GetRenderer()函数,它编译时没有错误。 Window和Renderer类之间唯一真正的区别是Renderer有另一个类(纹理)的#include,但据我所知,没有循环依赖。
以下是涉及的文件:
Display.h
#include <SDL2/SDL.h>
#include <iostream>
#include <memory>
#include "Window.h"
#include "Renderer.h"
#ifndef DISPLAY_H
#define DISPLAY_H
namespace MapTool {
namespace Display {
class Display {
public:
Display();
~Display();
std::shared_ptr<Window> CreateWindow(std::string title,
int openX, int openY,
int width, int height);
std::shared_ptr<Renderer> CreateRenderer(std::shared_ptr<Window> window);
private:
};
}
}
#endif
Display.cpp
#include "Display.h"
using namespace MapTool::Display;
Display::Display() {
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
std::cerr << "SDL Initialisation failed " << SDL_GetError() << std::endl;
}
}
Display::~Display() {
SDL_Quit();
}
std::shared_ptr<Window> Display::CreateWindow(std::string title,
int openX, int openY,
int width, int height) {
return std::shared_ptr<Window>(new Window(title, openX, openY, width, height));
}
std::shared_ptr<Renderer> Display::CreateRenderer(std::shared_ptr<Window> window) {
return std::shared_ptr<Renderer>(new Renderer(window->GetWindow()));
}
Renderer.h
#include <SDL2/SDL.h>
#include <iostream>
#include <memory>
#include "Texture.h"
#ifndef RENDERER_H
#define RENDERER_H
namespace MapTool {
namespace Display {
class Renderer {
public:
Renderer(SDL_Window *window);
~Renderer();
SDL_Renderer *GetRenderer();
void Clear();
void Copy(std::shared_ptr<Texture> texture);
void Present();
private:
SDL_Renderer *renderer;
};
}
}
#endif
Renderer.cpp
#include "Renderer.h"
using namespace MapTool::Display;
Renderer::Renderer(SDL_Window *window) {
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
if (renderer == NULL) {
std::cerr << "Failed to create renderer " << SDL_GetError() << std::endl;
} else {
SDL_SetRenderDrawColor(renderer, 0xFF, 0xFF, 0xFF, 0xFF);
}
}
Renderer::~Renderer() {
SDL_DestroyRenderer(renderer);
}
[...]
任何关于我失踪的指示都会非常感激。我觉得这可能是因为我对头文件不太确定,所以如果这是由于对如何使用它们的根本误解,那么任何指向优质资源的指针都会非常感激。