在虚幻引擎射击游戏示例中,'class DataType* Variable' 中的 'class' 是什么意思?

11

我最近下载了Unreal 4引擎的射击游戏,现在正试图分析其中的C++代码,但我的C++水平不太好,我注意到了一个名为

class AShooterCharacter* MyPawn; 

ShooterWeapon.h头文件中设置。

我试图理解class部分是什么意思。

[编辑] 我注意到有人贬低我的问题,所以我改成了一个问题。我希望人们愿意帮助我而不是贬低我的问题。没有愚蠢的问题: )...特别是在编程方面。


2
这是一个类指针变量声明。class关键字是可选的。 - πάντα ῥεῖ
1
我不明白为什么会有人踩这个问题。实际上,这是一个非常好的问题,因为这种声明语法很不寻常,特别是在使用class关键字时(struct可以被认为是C兼容性)。 - Lightness Races in Orbit
2
是的,这是一个关于“虚幻引擎为什么会这样做”的问题,而不仅仅是语言问题。 - paulecoyote
3个回答

8
如果AShooterCharacter已经在作用域内,那么它基本上可能什么也不意味着。
class AShooterCharacter* MyPawn;
// ^ the same as just:
// AShooterCharacter* MyPawn;

在C语言中,命名结构类型时必须使用 struct 关键字:
struct Foo
{
   int x, y, z;
};

struct Foo obj;

在C++中,你不需要这样做,因为Foo本身就成为了一个可命名的类型。
Foo obj;

如果您想要,仍然可以编写struct Foo

对于“class”来说也是如此,这只是语言语法和语义定义的结果。

只有两种情况下才会有所不同。

用法1:消除二义性

当在某些其他名称被隐藏时,您可以使用它来指定要引用的范围内类型名称,例如:

class Foo {};

int main()
{
   const int Foo = 3;

   // Foo x;     // invalid because `Foo` is now a variable, not a type
   class Foo x;  // a declaration of a `Foo` called `x`;
}

但是如果你觉得自己“需要”这个,那么在我看来,你有更大的问题!

用法2:前向声明

否则,这与进行以下操作相同:

class Foo;   // a forward declaration
Foo* x;

如果你要前向声明类型并立即声明该类型的对象指针,则可以通过这种方式节省一行代码。

不过,这并不是常见的编码风格。


是因为解决某些编译器问题而导致的吗?有人知道吗? - daparic

2

这就是所谓的“前向声明”。

它允许您指定一个指向类/结构体名称的指针,以便您不必包含定义该类/结构体的特定头文件。

当打破头文件之间的循环依赖关系时,此功能特别可行。

您可以通过检查ShooterWeapon.h中未包含任何定义AShooterCharacter的文件来验证这一点。


0

让我们从维基百科开始简单介绍。

类是使用关键字class声明的用户定义类型或数据结构,它具有数据和函数(也称为方法)作为其成员,其访问受三个访问说明符private、protected或public的控制(默认情况下,对类的成员的访问是私有的)。在C++中,使用关键字class声明的类与使用关键字struct声明的结构不同,因为默认情况下,类中的成员是私有的,而结构中的成员是公共的。私有成员在类外部不可访问;它们只能通过类的方法访问。公共成员形成了类的接口,并且可以在类外部访问。这些数据类型的实例称为对象,可以包含由程序员定义的成员变量、常量、成员函数和重载运算符。

类用于实现面向对象编程(OOP)。

通过在标识符前加上关键字 class,它就成为了一个数据类型(如 int 或 char),但好处是你可以决定其中包含哪些内容。例如:
class A
{
    int num;
    char ch;
  public:
    void getvalue ( )
    {
       std::cin >> num >> ch ;
    }
    void disp ( )
    {
       std::cout << num << std::endl << ch ;
    }
};

现在 A 是一个类,当你执行

A myobject ;

myobject 变成了类 A 的一个对象,也就是说,它变成了一个可以存储 intchar 值的数据类型(你还可以添加其他数据类型,比如 float)。

然后你可以调用函数 getvalue() 来获取 numch 的值,然后输出这些值,例如:

myobject.getvalue();
myobject.disp()

1
我知道什么是类。但我不明白为什么某人会在可选的情况下给类加前缀。相对于 A myobject;,使用 class A myobject; 有什么好处?无论如何,A 都是一种数据类型,无论您是否在其前面放置了 class。但是你说...“好处是你可以决定其中所有项”,也就是说,您可以忽略公共和私有成员和方法吗?不确定您的意思是什么。 - numerical25
1
@numerical25,这主要是回溯到C语言,有时需要在某些地方添加额外的“struct”关键字。 - Neil Kirk
2
这是一个关于类是什么的好解释,但你既没有理解也没有回答问题。 - Lightness Races in Orbit
我怀疑这与某些编译器的古怪行为有关,但需要确认。 - daparic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接