如何使非全局对象从函数中进行交互? 我试图用C++创建一个突破克隆,所以有几个对象(比如球、桨、PopuICON、Bug等)。我知道将它们放在全局范围是不好的做法,所以它们在main()中初始化。问题在于需要从其他函数(如redraw()或reset_game())内部处理这些对象。我能想到的唯一方法是将对象的引用传递到每个函数中,但我不确定这是否是最好的方法
基本上,从函数中处理这些对象的最佳方法是什么?通过引用传递它们?使它们成为全局的,但在名称空间内?或者完全不同的东西?如果是初始化您担心的顺序,您可以在全局范围内(可能在命名空间中)有一个指向它们的指针,并在主目录中为它们分配内存。如果是初始化您担心的顺序,您可以在全局范围内(可能在命名空间中)有一个指向它们的指针,并在main中为它们分配内存。我将创建一个包含所有这些信息的管理器对象。像一个类如何使非全局对象从函数中进行交互? 我试图用C++创建一个突破克隆,所以有几个对象(比如球、桨、PopuICON、Bug等)。我知道将它们放在全局范围是不好的做法,所以它们在main()中初始化。问题在于需要从其他函数(如redraw()或reset_game())内部处理这些对象。我能想到的唯一方法是将对象的引用传递到每个函数中,但我不确定这是否是最好的方法,c++,oop,object,C++,Oop,Object,基本上,从函数中处理这些对象的最佳方法是什么?通过引用传递它们?使它们成为全局的,但在名称空间内?或者完全不同的东西?如果是初始化您担心的顺序,您可以在全局范围内(可能在命名空间中)有一个指向它们的指针,并在主目录中为它们分配内存。如果是初始化您担心的顺序,您可以在全局范围内(可能在命名空间中)有一个指向它们的指针,并在main中为它们分配内存。我将创建一个包含所有这些信息的管理器对象。像一个类游戏有一个成员桨,砖,项目,等等pp。然后你可以,例如,让游戏有一个类方法当前游戏,返回当前游戏实例。
游戏
有一个成员桨
,砖
,项目
,等等pp。然后你可以,例如,让游戏
有一个类方法当前游戏
,返回当前游戏实例。这有点像在“全局范围”中使用它,但使用的是更面向对象的方式
例如:
类游戏{
公众:
桨*桨;
矢量*砖块;
矢量*项目;
静态游戏*currentGame();
静态无效setCurrentGame(Game*newGame);
私人:
静态游戏*currentGameInstance;
}
静态游戏*游戏::currentGame(){
返回当前游戏实例;
}
静态无效游戏::setCurrentGame(游戏*新游戏){
currentGameInstance=newGame;
}
<>(我对C++很生疏,希望语法正确)
这样你就可以随心所欲地玩游戏了。我会创建一个包含所有这些信息的管理器对象。像一个类
游戏
有一个成员桨
,砖
,项目
,等等pp。然后你可以,例如,让游戏
有一个类方法当前游戏
,返回当前游戏实例。这有点像在“全局范围”中使用它,但使用的是更面向对象的方式
例如:
类游戏{
公众:
桨*桨;
矢量*砖块;
矢量*项目;
静态游戏*currentGame();
静态无效setCurrentGame(Game*newGame);
私人:
静态游戏*currentGameInstance;
}
静态游戏*游戏::currentGame(){
返回当前游戏实例;
}
静态无效游戏::setCurrentGame(游戏*新游戏){
currentGameInstance=newGame;
}
<>(我对C++很生疏,希望语法正确)
这样你就可以随心所欲地玩Game::currentGame()->paid
。“最佳”有点主观;您已经命名了标准方法(即:名称空间中的全局方法或等效方法,或传递到每个函数)
在设计方面,我倾向于通过逻辑分组将对象分组在一起(例如,“游戏状态”对象中的某些内容,“UI资产”对象中的其他内容,等等),然后拥有这些对象的有效全局实例。我建议始终为对象提供一个有效的名称空间:这可以是字面意义上的名称空间,也可以是单例或命名实例工厂范例。通常,对象越“局部”,我就越倾向于将它们显式地传递给使用/操作它们的函数;对象的“应用程序级别”越高,我就越倾向于使它们成为有效的全局对象
希望对你有所帮助。“最好”有点主观;您已经命名了标准方法(即:名称空间中的全局方法或等效方法,或传递到每个函数)
在设计方面,我倾向于通过逻辑分组将对象分组在一起(例如,“游戏状态”对象中的某些内容,“UI资产”对象中的其他内容,等等),然后拥有这些对象的有效全局实例。我建议始终为对象提供一个有效的名称空间:这可以是字面意义上的名称空间,也可以是单例或命名实例工厂范例。通常,对象越“局部”,我就越倾向于将它们显式地传递给使用/操作它们的函数;对象的“应用程序级别”越高,我就越倾向于使它们成为有效的全局对象
希望能有所帮助。引用:
static关键字可以用四种不同的方式使用:
- 要为函数中的局部变量创建永久存储
- 要创建类数据的单个副本
- 声明与非成员函数类似的成员函数,以及
- 指定内部链接
void foo()
{
static int counter = 0;
cout << "foo has been called " << ++counter << " times\n";
}
int main()
{
for( int i = 0; i < 10; ++i )
foo();
}
void foo()
{
静态整数计数器=0;
cout引用自:
static关键字可以用四种不同的方式使用:
- 要为函数中的局部变量创建永久存储
- 要创建类数据的单个副本
- 声明与非成员函数类似的成员函数,以及
- 指定内部链接
还有其他例子
void foo()
{
static int counter = 0;
cout << "foo has been called " << ++counter << " times\n";
}
int main()
{
for( int i = 0; i < 10; ++i )
foo();
}
void foo()
{
静态整数计数器=0;
cout一种简单(不一定灵活或强大)的方法是定义一个基本的game\u对象
类,该类定义您与游戏对象的接口,并存储这些对象。您的对象从中继承:
class game_object
{
public:
virtual ~game_object() {}
virtual void update() = 0;
virtual void draw() = 0;
// get and set position
virtual vector3 position() = 0;
virtual void position(const vector3&) = 0;
// etc...
};
class ball : public game_object
{
public:
void update() { /* update the ball */ }
void draw() { /* draw the ball */ }
// etc
};
// etc
现在您有了一种使用游戏对象的常用方法。接下来,您可以将这些对象存储在地图中(如果您有Boost、TR1或C++0x,则最好是一个无序的\u地图),并使该地图全局可用:
// game_object_manager.h
typedef std::map<std::string, game_object*> game_object_manager;
extern game_object_manager manager;
并使用它:
game_object* b = manager["ball"];
if (!b) /* there is no ball object */
// use b as ball */
同样,这是一个简单的解决方案,不一定是r
game_object* b = manager["ball"];
if (!b) /* there is no ball object */
// use b as ball */