如何在C ++中创建静态全局类? (或者我应该这样做不同吗?)

时间:2014-11-16 05:55:00

标签: c++

我想要的是一个包含任何其他类可以访问的对象和变量的类,而无需创建该类的对象或从创建它的类中获取对该对象的引用。我知道在Java中可以创建一个静态类来执行此操作,但它似乎不像C ++中存在静态类。我怎么能做到这一点?

让我进一步澄清我正在寻找的内容 假设我有一个名为“暴徒”的班级,在更新时,寻找玩家并向他移动。我可以通过在mob的更新函数中引用播放器来实现这一点,或者更好的是在mob类中创建一个指针,该指针在初始化时分配给播放器的引用。但是,我真正想要的是能够包含像“Global.h”这样的标题并将播放器放在那里。然后当暴徒或程序中的任何其他对象想要从玩家那里获取一些数据时,它可以使用像Global.player.GetPos()这样的东西

或者这可能是我现在应该忘记的糟糕做法。在这种情况下,请告诉我一个更好的方法来做这整件事。感谢。

1 个答案:

答案 0 :(得分:1)

你可以使用单例模式(你可以在任何地方找到很多,比如上面评论中提到的Neil Kirk),或者,如果你不需要面向对象的机制(如继承或多态),我个人成长习惯于只使用简单的函数而不是类。

<强> Mob.hpp

#ifndef MOB_HPP
#define MOB_HPP

namespace Mob {

// "public" functions and variables
extern int someVariable;
extern void moveTowards(Player* player);
extern void retreat(void);

}

#endif

<强> Mob.cpp

#include "Mob.hpp"

// "private" functions and variables
static long _lastUpdate;
static void seekOut(Player* player) {
    //...
}

// "public" function implementation and variables
namespace Mob {
    int someVariable = 0;

    void moveTowards(Player* player) {
        //...
    }

    void retreat(void) {
        //...
    }
}

<强>用法

#include "mob.hpp"

int var = Mob::someVariable;
Mob::moveTowards(player);

标题基本上定义了静态类中通常具有的所有公共方法。这些标记为extern,因此它们具有外部链接,可以在其他编译单元中使用。

在.cpp文件中还有一些标记为static的附加内容。将全局函数或变量声明为static时,它们具有内部链接,并且仅在定义它们的单元中可见。所以从某种意义上说,他们是私人

有些人认为这种做法有点倒退,但老实说,当处理单身人士没有需要以某种方式实际使用它们作为一个类,或者获得指向单例实例的指针时,功能更简单。但有一个缺点:如果你想让mob不再是一个单例,而是一个可实例化的对象,那么你以后就必须编写一个类。