gpt4 book ai didi

c++ - 循环依赖问题

转载 作者:太空宇宙 更新时间:2023-11-04 13:47:26 24 4
gpt4 key购买 nike

在尝试制作一款简单的游戏时,我遇到了循环依赖问题。我在互联网上搜索并发现前向声明可以修复它,但是......我的两个类都依赖于一个静态值。

是否有任何简单的修复方法,也许是转发声明静态值,或者我是否必须重写游戏的核心?

第二次编辑:看起来我错了,即使删除几乎所有内容后错误仍然存​​在:

主要.cpp:

#include "App.h"

//Start the app
int main(int argc, char* args[]){
App App;

return App.on_execute();
}

应用.h:

#ifndef APP_H
#define APP_H
#include "Object.h"

class App
{
public:

//Runs when the program starts
int on_execute();

};

#endif // APP_H

应用程序.cpp:

#include "App.h"


int App::on_execute(){
return 0;
}

对象.h:

#ifndef OBJECT_H
#define OBJECT_H
#include <string>
#include <vector>
#include <stdio.h>
#include <SDL.h>
#include <math.h>
#include "Entity.h"

class Object
{
public:
Object(int character, int x, int y, std::string name, SDL_Color color, bool blocks);

//Object vector
static std::vector<Object*> objects;
};

#endif // OBJECT_H

对象.cpp:

#include "Object.h"

std::vector<Object*> Object::objects;

Object::Object(int character, int x, int y, std::string name, SDL_Color color, bool blocks){
}

实体.h:

#ifndef ENTITY_H
#define ENTITY_H
#include "Object.h"
#include <sdl.h>

class Entity : public Object
{
public:
Entity(int character, int x, int y, std::string name, SDL_Color color, bool blocks, int hp, int power, int defense);
};

#endif // ENTITY_H

实体.cpp:

#include "Entity.h"

Entity::Entity(int character, int x, int y, std::string name, SDL_Color color, bool blocks, int hp, int power, int defense) : Object(character, x, y, name, color, blocks){
}

最佳答案

我认为您的代码设计可能需要重新设计。

首先,我真的不鼓励您尽可能使用非原始的、非平凡的类静态,无论是类静态还是全局静态。非平凡的静态类在 main 之前将有一个显式构造函数调用,并且需要注册一个销毁以在 main 之后调用。这些东西的相对顺序是不确定的。更糟糕的是,如果您稍后有一个库结构,使得来自同一个 .cpp 文件的程序集出现两次,奇怪的事情可能会发生,即构建了对象的两个拷贝,但同一个拷贝被销毁了两次。

其次,部分信息不明确。例如,您声称 Map 类有一个 Map 类型的静态成员。我真的不认为这是可能的;静态 Map 成员也将有一个 map 类型的对象,等等。与在 Object 中声明的对象 vector 类似。也许在这两种情况下,您的意思是在文件 Map.cpp 或 Object.cpp 内部,而不是在类内部?

第三,清楚前向声明为您提供了什么。它使编译意识到某些东西存在,仅此而已。它让您拥有指向该类型的指针和引用。您不能创建对象,甚至不能声明前向声明类型的成员变量,因为编译器不知道前向声明对象的大小。您不能使用它的方法,因为编译器不知道它们的存在。

第四,你根本就没有谈及你的头文件。如果 Map.h 需要 Object.h,这只是循环依赖,反之亦然。两个头文件不能同时包含彼此。另一方面,实现在 Map.cpp 和 Object.cpp 中,这两个文件都可以包含 Map.h 和 Object.h。但是,我个人更愿意避免使用相互依赖的类。

我可能建议的是 map 应该拥有该 map 上存在的对象。现在 Map 访问这个全局的模式不是一个好模式。不要让对象成为全局对象,而是让 std::vector 对象成为 Map 类的成员。请注意,如果您稍后决定拥有多个 map ,效果会更好,每个 map 都将拥有位于该 map 上的对象。如果有多个 Map,当前的设计将无法正常工作。

然后您可以将 move_to 实现为不是 Object 的方法,而是 Map 的方法。 Map::move_to(i, dx, dy) 移动第 i 个对象。

关于c++ - 循环依赖问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25320728/

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