这是我的第一个问题,所以我提前为任何有关堆栈溢出的事情道歉,我可能不知道!
我遇到的问题是我正在制作一个简单的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。
答案 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文件)。
这些链接可能有所帮助:
答案 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;