Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使非全局对象从函数中进行交互? 我试图用C++创建一个突破克隆,所以有几个对象(比如球、桨、PopuICON、Bug等)。我知道将它们放在全局范围是不好的做法,所以它们在main()中初始化。问题在于需要从其他函数(如redraw()或reset_game())内部处理这些对象。我能想到的唯一方法是将对象的引用传递到每个函数中,但我不确定这是否是最好的方法_C++_Oop_Object - Fatal编程技术网

如何使非全局对象从函数中进行交互? 我试图用C++创建一个突破克隆,所以有几个对象(比如球、桨、PopuICON、Bug等)。我知道将它们放在全局范围是不好的做法,所以它们在main()中初始化。问题在于需要从其他函数(如redraw()或reset_game())内部处理这些对象。我能想到的唯一方法是将对象的引用传递到每个函数中,但我不确定这是否是最好的方法

如何使非全局对象从函数中进行交互? 我试图用C++创建一个突破克隆,所以有几个对象(比如球、桨、PopuICON、Bug等)。我知道将它们放在全局范围是不好的做法,所以它们在main()中初始化。问题在于需要从其他函数(如redraw()或reset_game())内部处理这些对象。我能想到的唯一方法是将对象的引用传递到每个函数中,但我不确定这是否是最好的方法,c++,oop,object,C++,Oop,Object,基本上,从函数中处理这些对象的最佳方法是什么?通过引用传递它们?使它们成为全局的,但在名称空间内?或者完全不同的东西?如果是初始化您担心的顺序,您可以在全局范围内(可能在命名空间中)有一个指向它们的指针,并在主目录中为它们分配内存。如果是初始化您担心的顺序,您可以在全局范围内(可能在命名空间中)有一个指向它们的指针,并在main中为它们分配内存。我将创建一个包含所有这些信息的管理器对象。像一个类游戏有一个成员桨,砖,项目,等等pp。然后你可以,例如,让游戏有一个类方法当前游戏,返回当前游戏实例。

基本上,从函数中处理这些对象的最佳方法是什么?通过引用传递它们?使它们成为全局的,但在名称空间内?或者完全不同的东西?

如果是初始化您担心的顺序,您可以在全局范围内(可能在命名空间中)有一个指向它们的指针,并在主目录中为它们分配内存。

如果是初始化您担心的顺序,您可以在全局范围内(可能在命名空间中)有一个指向它们的指针,并在main中为它们分配内存。

我将创建一个包含所有这些信息的管理器对象。像一个类
游戏
有一个成员
项目
,等等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 */