c++ 类指针 * 是什么意思?

xbp102n0  于 2022-11-27  发布在  其他
关注(0)|答案(3)|浏览(191)

我得到了这个语法我真的不明白:

class USphereComponent* ProxSphere;

我认为这意味着创建一个类,但这个类是指针吗?
但结果只是从现有的类USphereComponent创建了一个名为ProxSphere的对象。
这个语法的实际含义是什么,它的用法是什么?

lnlaulya

lnlaulya1#

class Someotherclass; // That has not been defined yet

class HelloWorld
{
    Someotherclass* my_pointer;
};

或者另一种选择:

class HelloWorld
{
    class Someotherclass* my_pointer;
};

如果您有多个指向此类尚未定义的指针(或引用),则第一个显然是正确的。
第二个更好吗?(我不知道)如果你只需要做一次,否则做

class HelloWorld
{
    class Someotherclass* my_pointer;
    class Someotherclass* my_pointer2;
    class Someotherclass* my_pointer3;

    void func(class Someotherclass* my_pointer, class Someotherclass& my_ref);
};

可能不是最好的。

50pmv0ei

50pmv0ei2#

Jts的答案是正确的,我想为它添加一个用例:
这通常在具有循环类依赖项时使用。
如:

class A { B* binst; };
class B { A* ainst; };

因为B之前是未知的,所以不会编译。
因此,您应该首先声明类B。

class B;
class A { B* binst; };
class B { A* ainst; };

或者如前所述,你可以使用sugar语法:

class A { class B* binst; };
class B { A* ainst; };

这样的依赖可能是一种代码味道。它也可能是可以的,甚至是必要的。如果你有它,你应该仔细考虑,如果你不能用其他一些方便的方式来做。

3qpi33ja

3qpi33ja3#

这种特殊的语法称为“forward declaration“,它用于声明尚未定义的类型。
这基本上就是告诉编译器“存在一个名为USphereComponent的类类型,您还没有看到它,稍后将在代码中出现。如果您看到该类型的指针,请不要对我大喊大叫”。这允许您为该前向声明类型声明 * 指针和引用 *。
书写:

class USphereComponent* ProxSphere;

其实就相当于这样写:

class USphereComponent;
USphereComponent* ProxSphere;

与第二种语法的唯一区别是,当您像class USphereComponent;这样做时,只需要向前声明类型一次,否则您需要使用第一种语法,并在每次使用USphereComponent之前添加class关键字。
使用前向声明的主要原因有两个:

  • 这可能是Unreal Engine中最常见的前向声明用法。在头文件(.h)中,前向声明允许您使用类指针,而您没有使用相应的头文件#include。在我们的特定示例中,这意味着前向声明USphereComponent意味着我们不需要#include "SphereComponent.h"语句(如果我们只是试图传递一个USphereComponent)。

通常情况下,#include语句只在.cpp文件中执行。减少头文件中include的数量主要有两个好处:

  • 编译时间更快。请注意,这对像Unreal的代码库一样大的代码库有很大的影响。
  • 这减少了模块的公共依赖项的数量(通过使它们成为“私有的”,因为你的包含现在在你的.cpp中)。这使你的模块更容易被依赖,也使它的接口更干净。
  • 就像其他答案所说的那样,当在同一个文件中有两个相互依赖的类型时,可以使用前向声明来打破循环依赖:
class B;
class A
{
    B* foo;
};
class B
{
    A* bar;
};

相关问题