C ++通过引用将`this`传递给方法

Posted

技术标签:

【中文标题】C ++通过引用将`this`传递给方法【英文标题】:C++ Passing `this` into method by reference 【发布时间】: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 是不必要的,因为引用(与指针不同)不能重新定位以引用另一个对象。 【参考方案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 修饰符,它现在可以正常工作了。

以上是关于C ++通过引用将`this`传递给方法的主要内容,如果未能解决你的问题,请参考以下文章

OOP:将对象与将属性传递给方法

通过引用将字符串数组传递给 C 函数

通过引用将值类型变量传递给静态方法线程安全吗?

将const引用/指针传递给类进行存储的首选方法,而不是复制引用的对象

通过指针或引用将映射传递给函数?

如何通过引用将文件传递给函数?