gpt4 book ai didi

C++ 双重声明或无声明问题

转载 作者:行者123 更新时间:2023-11-28 04:54:40 25 4
gpt4 key购买 nike

我正在编写一个简单的游戏并且我已经完成了它,只是它的文件结构很糟糕并且每个类都只是一个 .h 文件。

我决定将声明和定义拆分到单独的文件中,因为我遇到了循环包含问题(这是可以预见的)。

现在我已经将它们拆分成单独的文件,我的 .h 文件包含:

  • 类的声明,它是方法、枚举和其他变量。
  • 包含 .cpp 或 .h 需要的必要文件(所以基本上 .cpp 包含它的 .h 文件,它得到了它需要的所有包含)。

虽然我的 .cpp 文件包含:

  • 方法的定义。

好的,现在您对我的文件的结构有了大致的了解,这就是我遇到的问题。

Spaceship.cpp 需要 Core.h 中存在的 cursorPos 变量

Core.h 包含 Spaceship.h,因为它需要一个方法。

如果我在 Spaceship.h 中包含 Core.h,我会得到双重声明。

如果我不在 Spaceship.h 中包含 Core.h,我会得到 no-declaration。

我很无能,我是否应该创建一个“Helper”类,其中包含我想在类之间交叉共享的变量?

编辑按要求编码

spaceship .h

#pragma once
#ifndef SPACESHIP_H
#define SPACESHIP_H

#include "Vector2D.h"
#include "Entity.h"
#include "Missile.h"
#include <SDL.h>
#include "Core.h"

extern const int SPACESHIP_SHOOT_DELAY = 50;
extern const int SPACESHIP_MAX_VELOCITY = 10;
extern const float SPACESHIP_VELOCITY_GAIN = 0.05;
extern const float SPACESHIP_VELOCITY_LOSS = -0.15;
class Spaceship : public Entity
{
public:
Vector2D position = Vector2D(0, 0);
Vector2D direction = Vector2D(0, 0);
SDL_Texture* texture;

//Required by rendering
SDL_Rect renderbox = { 0, 0, 32, 32 };
SDL_Rect boundingbox = { 0, 0, 32, 32 };
SDL_Point center = { 16, 16 };

int lastShot = SDL_GetTicks();
int angle = 0;
float velocity = 0;
void Update() override;
void Render(SDL_Renderer* renderer) override;
void Fire();

Spaceship();
~Spaceship();
};
#endif

核心.h

#pragma once
#ifndef CORE_H
#define CORE_H

#include "Vector2D.h"
#include <SDL.h>
#include "Spaceship.h"

extern Vector2D cursorPos = Vector2D();
class Core
{
private:
static bool run;

public:
static SDL_Window* window;
static SDL_Renderer* renderer;
static SDL_Cursor* cursor;
static int screenWidth;
static int screenHeight;

static void Initialize();
static void ProcessEvents(SDL_Event* e);
static void Update();
static void Render();
static int Execute();
static void Cleanup();

Core();
~Core();
};

#endif

我得到的错误 enter image description here

最佳答案

变量的定义也应该位于 .cpp 文件中。 header 应使用 extern 关键字声明它:

核心.h:

extern Point cursorPos;

核心.cpp:

#include "Core.h"
...
Point cursorPos;

关于C++ 双重声明或无声明问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47456735/

25 4 0
文章推荐: c++ - 使用 Visual Studio 2017 进行并行编程
文章推荐: php - 如何在html
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com