繁体   English   中英

C++ 引用变量的声明需要初始化程序?

[英]C++ Declaration of reference variable requires an initializer?

我有一个指针/取消引用问题,我收到错误:

引用变量的声明需要一个初始化器

具有以下内容:

CastInfo& out;
if(SegmentCast(mOwner->GetGame()->GetPlayer(), mLineSegment, out))
{

此 SegmentCast function 使用以下参数定义:

bool SegmentCast(Actor* actor, const LineSegment& l, CastInfo& outInfo)

CastInfo定义为:

struct CastInfo
{
    // Point of collision
    Vector3 mPoint;
    // Normal at collision
    Vector3 mNormal;
    // Owning actor you collided with
    class Actor* mActor = nullptr;
};

因为没有构造函数,我无法通过执行CastInfo& out = CastInfo()进行初始化,但我不知道如何使用 CastInfo output 调用 SegmentCast function。

如何使用此参考变量正确调用此 function?

此代码的 2 个问题

CastInfo& out;
if(SegmentCast(mOwner->GetGame()->GetPlayer(), mLineSegment, out))
{

首先,您实际上必须在某个地方有一个 CastInfo 实例,可以在对 SegmentCast 的调用中引用它

其次,您不能创建未绑定到实际 object 的引用(与指针不同)

如果你想要一个本地实例

 CastInfo out;
 if(SegmentCast(mOwner->GetGame()->GetPlayer(), mLineSegment, out))
 {

这将创建一个本地堆栈实例,将传递对它的引用(您无需执行任何其他操作,编译器知道这就是 function 想要的)

或者如果你需要一个堆实例

CastInfo *out= new CastInfo();
if(SegmentCast(mOwner->GetGame()->GetPlayer(), mLineSegment, *out))
{

这会指向堆 object。要将它传递给 function,您需要对它进行推导 ( *out ),然后编译器会将其作为引用传递(就像第一个示例一样)

理想情况下,您会使用std::unique_ptr而不是原始的new和指针。 如果你不这样做,那么记得在完成后删除

警惕指针和引用之间的类比; 这通常会令人困惑。 指针可以指向任何地方; 引用总是指向 object。因此,尽管您可以写出CastInfo* out; , 它创建一个具有未指定值的指针,你不能写CastInfo& out; ; 这是不允许的。 如果您需要创建引用,则必须有一个它引用的 object:

CastInfo info;
CastInfo& out = info;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM