C ++问题创建类对象和循环包含

时间:2015-12-17 01:20:15

标签: c++ visual-studio class compiler-errors syntax-error

这是我的第一个问题,所以我提前为任何有关堆栈溢出的事情道歉,我可能不知道!

我遇到的问题是我正在制作一个简单的SDL程序,目前只是将PNG图像(Assets / Board.png)绘制到屏幕上,但我面临着很多与之相关的错误这两个类相互通信,我认为我有循环包含错误。但是我一直试图解决这个问题好几天,但我还没能解决它。

以下是我遇到的错误:

http://imgur.com/gallery/vq3XLwU/new

(这是它的文本版本,但格式不好抱歉)

//Include guards.
#pragma once

//Headers.
#include "Render.h"

//Librarys.
#include <SDL_image.h>
#include <string>
#include <SDL.h>

//Namespaces.
using namespace std;

//Enumerator.
enum State { Play, Exit };

class Manager
{
public:
    Manager(); //Constructor.
    ~Manager(); //Destructor.

    //Rendering.
    SDL_Window* Window;
    SDL_Surface* Screen;
    SDL_Renderer* Renderer;

    //Functions.
    void Run();
    void Init();
    void Close();
    void Input();
    void Update();
    void Error(string);

    //Game variables.
    State state;
    Render Tex;

private:

    //Constant values.
    const int WINDOW_POS_X = SDL_WINDOWPOS_CENTERED;
    const int WINDOW_POS_Y = SDL_WINDOWPOS_CENTERED;
    const int INIT_FLAGS = SDL_INIT_VIDEO;
    const int SCREEN_HEIGHT = 600;
    const int SCREEN_WIDTH = 600;
};

(我使用过图像,因为图像的格式更容易阅读。) (还可以点击imgur中的图像查看放大的版本)

您可以在此处下载整个代码项目(ZIP文件):

https://www.mediafire.com/?og21315fc1d58sk

但是我认为这是导致问题的代码:

(Manager.h文件)

//Include guards.
#pragma once

//Headers.
#include "Manager.h"

//Librarys.
#include <SDL_image.h>
#include <string>
#include <SDL.h>

//Namespaces.
using namespace std;

class Render
{
public:
    Render(); //Constructor.
    ~Render(); //Destructor.

    //Functions.
    void Draw(int, int); //Draws texture at position.
    void Load(string); //Loads texture from path.
    void Deallocate(); //Destroy texture.

    //Getter functions.
    int GetHeight() { return Height; };
    int GetWidth() { return Width; };

private:
    SDL_Texture* Texture; //Actual image.
    Manager manager; //Manager class.

    int Height; //Height of image.
    int Width; //Wdith of image.
};

(这里是Render.h文件)

let gallNumb = sentJumping[0].characters.split(":").map{ String($0) }

总而言之,我遇到了与类对象有关的错误,我认为这是由循环包含引起的,尽管我的研究无法解决这些问题。我非常感谢你对这个问题的任何帮助。

P.S我知道我不应该使用std命名空间,而是我必须写std :: foo,我知道,所以请不要评论它!

- 提前谢谢,Cameron Bell。

3 个答案:

答案 0 :(得分:1)

在C ++中,“所有权”是非常重要的概念。一个班级“拥有”其成员。问题是你有两个对象,并且你告诉编译器两者都“拥有”另一个,这是不行的。你必须决定他们中哪一个拥有另一个,并将其作为一个成员(或者可能不拥有另一个)。至少有一个类必须引用到另一个类,而不是将其列为子/成员。最好的参考是指针。

class Manager; 
// this forward declaration tell the compiler the class exists, but 
// we don't care about the details yet, so we won't include the header.
// if we try to include it, that header refers to Render, which the compiler
// hasn't seen yet, so the compiler will fail.
class Render
{
public:
    Render(Manager* parent_); //Constructor.
    ...stuff...
    Manager* parent;
};

Cpp文件:

#include "manager.h"
#include "render.h"
Render::Render(Manager* parent_)
    : parent(parent_) 
{}

答案 1 :(得分:0)

SUGGESTIONS: 1.消除&#34; Render.h&#34;包括:

在&#34; Manager.h&#34;中似乎没有任何东西。这需要&#34; Render.h&#34; - 为什么要包括它?

同样,2。消除&#34; Manager.h&#34;包括

您只需使用&#34; forward declaration&#34;,而不是包含整个类接口(.h文件)。

这些链接可能有所帮助:

C++ circular include

Headers and Includes: Why and How

答案 2 :(得分:0)

好的,我认为我已经解决了这个问题,感谢各种评论。解决方案可能不是优雅的,但它的工作原理。我没有在Manager标头内定义 Render Tex 变量,而是在Manager.cpp类中声明了它。完成后我可以在Manager .cpp文件中#include“Render.h”。我不知道这个解释是否清楚,但这里是manager.h文件的顶部:

//Include guards.
#pragma once

//Librarys.
#include <SDL_image.h>
#include <string>
#include <SDL.h>

这是Manager.cpp文件的顶部:

//Header.
#include "Manager.h"
#include "Render.h"

//Librarys.
#include <iostream>

//Objects.
Render Tex;