【问题标题】:C++ Is "class Name*" a class pointer?C++“类名*”是类指针吗?
【发布时间】:2017-04-10 05:05:12
【问题描述】:

我在看一个虚幻教程,遇到了这行代码:

class UStaticMeshComponent*  Pickup;

这是一个转发声明。 我学习c++有一段时间了,以前没有遇到过这样的事情。我知道指针和引用,但我从未见过这种格式:类名*。我们是否正在创建指向另一个类的类指针?我尝试搜索后跟 * 的类名,但出现的唯一结果是关于数据类型和指针。

public:
    APickUp ();

    virtual void BeginPlay () override;

    virtual void tick ( float DeltaSeconds );

private:
    class UStaticMeshComponent* Pickup;

【问题讨论】:

  • 请不要发布代码截图。使用文本(与图像相反)并将其格式化为代码(ctrl-k 快捷键)

标签: class c++11 pointers unreal-engine4


【解决方案1】:
class UStaticMeshComponent*  Pickup;

这声明了class UStaticMeshComponent 类型,还声明了UStaticMeshComponent 类型指针的变量Pickup。所以上面的代码或多或少等同于:

class UStaticMeshComponent;
UStaticMeshComponent*  Pickup;

因为此时您没有UStaticMeshComponent 的定义(只是声明),所以UStaticMeshComponent 被认为是不完整的类型。您可以对不完整类型执行一些操作。其中之一是声明指向它们的指针。

【讨论】:

  • 如果在课堂上和问题中一样,有什么区别吗?是对内部类还是对同一命名空间中的类的前向声明?
【解决方案2】:

当您只使用指向类型的指针时,类型不需要完整,因此即使 UStaticMeshComponent 尚未定义,它也可以正常工作。这意味着当此标头包含在您的一个 cpp 文件中时,它的编译速度应该比 Pickup.h 包含定义 UStaticMeshComponent 的标头时要快一些。

这种加速可能很大,具体取决于该标头的大小以及编译期间避免包含多少次。

【讨论】:

    【解决方案3】:

    这里最大的困惑是:

    class UStaticMeshComponent*  Pickup;
    

    class UStaticMeshComponent  *Pickup;
    

    甚至这个:

    class UStaticMeshComponent  *  Pickup;
    

    ,如示例中的http://www.cplusplus.com/doc/tutorial/classes/#pointers_to_classes

    不同之处在于 - 不好的做法。所有人都应该表示相同的意思,但只有第二个示例是正确的,但它们都有效。


    至少按照这个: https://users.ece.cmu.edu/~eno/coding/CppCodingStandard.html

    将 * 靠近变量名而不是指针类型

    我是新手,我可能错了。如果我错了,请纠正我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多