【问题标题】:C++ Passing `this` into method by referenceC ++通过引用将`this`传递给方法
【发布时间】:2012-06-25 14:14:12
【问题描述】:

我有一个类构造函数,它期望对另一个类对象的引用作为参数传入。我知道当不执行指针运算或不存在空值时,引用比指针更可取。

这是构造函数的头声明:

class MixerLine {

private:
    MIXERLINE _mixerLine;
    
public:

    MixerLine(const MixerDevice& const parentMixer, DWORD destinationIndex); 

    ~MixerLine();
}

这是调用构造函数(MixerDevice.cpp)的代码:

void MixerDevice::enumerateLines() {
    
    DWORD numLines = getDestinationCount();
    for(DWORD i=0;i<numLines;i++) {
        
        MixerLine mixerLine( this, i );
        // other code here removed
    }
}

MixerDevice.cpp 编译失败并出现以下错误:

错误 3 错误 C2664: 'MixerLine::MixerLine(const MixerDevice &,DWORD)' : 无法将参数 1 从 'MixerDevice *const ' 转换为 'const MixerDevice &'

但我认为指针值可以分配给引用,例如

Foo* foo = new Foo();
Foo& bar = foo;

【问题讨论】:

  • const MixerDevice&amp; const parentMixer 第二个const 是不必要的,因为引用(与指针不同)不能重新定位以引用另一个对象。

标签: c++ reference pass-by-reference


【解决方案1】:

指针值可以分配给指针,但不能分配给引用!1

Foo* foo = new Foo();
Foo& bar = *foo;
           ^
           ^


1。好吧,它们可以用来初始化对指针的引用,但这不是你在这里所拥有的......

【讨论】:

    【解决方案2】:

    this 是一个指针,要获得引用,您必须取消引用 (*this) 它:

    MixerLine mixerLine( *this, i );
    

    【讨论】:

      【解决方案3】:

      您应该取消引用this,因为this 是一个指针,而不是一个引用。要更正您的代码,您应该编写

      for(DWORD i=0;i<numLines;i++) {
      
          MixerLine mixerLine( *this, i ); // Ok, this dereferenced
          // other code here removed
      }
      

      注意:构造函数参数const MixerDevice&amp; const parentMixer处的第二个const完全没用。

      【讨论】:

        【解决方案4】:

        如前所述,要从指针获取引用,您需要取消引用指针。此外(可能是由于复制到问题中?)构造函数不应该编译:

        const MixerDevice& const parentMixer
        

        那不是正确的类型,引用不能是 const 限定的,只有被引用的类型可以,所以两个(完全等价的)选项是:

        const MixerDevice& parentMixer
        MixerDevice const& parentMixer
        

        (请注意,MixerDeviceconst 限定可以通过任何一种方式完成,其含义完全相同)。

        【讨论】:

        • 是的,我删除了第二个 const 修饰符,它现在可以正常工作了。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-23
        • 2020-05-03
        • 2011-12-07
        • 1970-01-01
        • 2014-04-24
        • 1970-01-01
        相关资源
        最近更新 更多