c ++ - 在此范围内未声明'X':一个自定义类被识别但另一个不被识别

时间:2017-07-02 19:08:09

标签: c++ c++11 include header-files

我正在尝试学习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);
}

[...]

任何关于我失踪的指示都会非常感激。我觉得这可能是因为我对头文件不太确定,所以如果这是由于对如何使用它们的根本误解,那么任何指向优质资源的指针都会非常感激。

0 个答案:

没有答案