我得到了这个语法我真的不明白:
class USphereComponent* ProxSphere;
我认为这意味着创建一个类,但这个类是指针吗?但结果只是从现有的类USphereComponent创建了一个名为ProxSphere的对象。这个语法的实际含义是什么,它的用法是什么?
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); };
可能不是最好的。
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; };
这样的依赖可能是一种代码味道。它也可能是可以的,甚至是必要的。如果你有它,你应该仔细考虑,如果你不能用其他一些方便的方式来做。
3qpi33ja3#
这种特殊的语法称为“forward declaration“,它用于声明尚未定义的类型。这基本上就是告诉编译器“存在一个名为USphereComponent的类类型,您还没有看到它,稍后将在代码中出现。如果您看到该类型的指针,请不要对我大喊大叫”。这允许您为该前向声明类型声明 * 指针和引用 *。书写:
USphereComponent
其实就相当于这样写:
class USphereComponent; USphereComponent* ProxSphere;
与第二种语法的唯一区别是,当您像class USphereComponent;这样做时,只需要向前声明类型一次,否则您需要使用第一种语法,并在每次使用USphereComponent之前添加class关键字。使用前向声明的主要原因有两个:
class USphereComponent;
class
#include
#include "SphereComponent.h"
通常情况下,#include语句只在.cpp文件中执行。减少头文件中include的数量主要有两个好处:
class B; class A { B* foo; }; class B { A* bar; };
3条答案
按热度按时间lnlaulya1#
或者另一种选择:
如果您有多个指向此类尚未定义的指针(或引用),则第一个显然是正确的。
第二个更好吗?(我不知道)如果你只需要做一次,否则做
可能不是最好的。
50pmv0ei2#
Jts的答案是正确的,我想为它添加一个用例:
这通常在具有循环类依赖项时使用。
如:
因为B之前是未知的,所以不会编译。
因此,您应该首先声明类B。
或者如前所述,你可以使用sugar语法:
这样的依赖可能是一种代码味道。它也可能是可以的,甚至是必要的。如果你有它,你应该仔细考虑,如果你不能用其他一些方便的方式来做。
3qpi33ja3#
这种特殊的语法称为“forward declaration“,它用于声明尚未定义的类型。
这基本上就是告诉编译器“存在一个名为
USphereComponent
的类类型,您还没有看到它,稍后将在代码中出现。如果您看到该类型的指针,请不要对我大喊大叫”。这允许您为该前向声明类型声明 * 指针和引用 *。书写:
其实就相当于这样写:
与第二种语法的唯一区别是,当您像
class USphereComponent;
这样做时,只需要向前声明类型一次,否则您需要使用第一种语法,并在每次使用USphereComponent
之前添加class
关键字。使用前向声明的主要原因有两个:
#include
。在我们的特定示例中,这意味着前向声明USphereComponent意味着我们不需要#include "SphereComponent.h"
语句(如果我们只是试图传递一个USphereComponent)。通常情况下,#include语句只在.cpp文件中执行。减少头文件中include的数量主要有两个好处: