gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:55:09 25 4
gpt4 key购买 nike

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

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

这是我遇到的错误:

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

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

1>d:\code\c++\games\chess\chess\manager.h(41): error C2079: 'Manager::Tex' uses undefined class 'Render'
1>d:\code\c++\games\chess\chess\render.h(32): error C2146: syntax error : missing ';' before identifier 'manager'
1>d:\code\c++\games\chess\chess\render.h(32): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>d:\code\c++\games\chess\chess\render.h(32): error C2146: syntax error : missing ';' before identifier 'manager'
1>d:\code\c++\games\chess\chess\render.h(32): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

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

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

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

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

(Manager.h文件)

//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;
};

(这里是 Render.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.
};

总而言之,我遇到了与类对象相关的错误,我认为这是由循环包含引起的,尽管我进行了研究,但我无法解决这些问题。如果您能就此问题提供帮助,我将不胜感激。

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

最佳答案

在 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_)
{}

关于C++ 创建类对象和循环包含的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34325115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com