12 votes

C++ Passer `this` dans une méthode par référence

J'ai un constructeur de classe qui s'attend à ce qu'une référence à un autre objet de classe lui soit transmise comme argument. Je comprends que les références sont préférables aux pointeurs lorsqu'aucune arithmétique de pointeur n'est effectuée ou lorsqu'une valeur nulle n'existe pas.

Il s'agit de la déclaration d'en-tête du constructeur :

class MixerLine {

private:
    MIXERLINE _mixerLine;

public:

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

    ~MixerLine();
}

Voici le code qui appelle le constructeur (MixerDevice.cpp) :

void MixerDevice::enumerateLines() {

    DWORD numLines = getDestinationCount();
    for(DWORD i=0;i<numLines;i++) {

        MixerLine mixerLine( this, i );
        // other code here removed
    }
}

La compilation de MixerDevice.cpp échoue avec cette erreur :

Erreur 3 erreur C2664 : 'MixerLine::MixerLine(const MixerDevice &,DWORD)' : impossible de convertir le paramètre 1 de 'MixerDevice *const ' en 'const MixerDevice &'

Mais je pensais que les valeurs des pointeurs pouvaient être affectées à des références, par exemple

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

19voto

ybungalobill Points 31467

this est un pointeur, pour obtenir une référence, il faut déréférencer ( *this ) :

MixerLine mixerLine( *this, i );

3voto

Vous devez déréférencer this parce que this est un pointeur et non une référence. Pour corriger votre code, vous devez écrire

for(DWORD i=0;i<numLines;i++) {

    MixerLine mixerLine( *this, i ); // Ok, this dereferenced
    // other code here removed
}

Remarque : le deuxième const au paramètre du constructeur const MixerDevice& const parentMixer est totalement inutile.

1voto

Pour obtenir une référence à partir d'un pointeur, il faut déréférence le pointeur, comme cela a déjà été mentionné. De plus (peut-être à cause de la copie dans la question ?) le constructeur ne devrait pas compiler :

const MixerDevice& const parentMixer

Ce n'est pas un type propre, les références ne peuvent pas être qualifiées const, seul le type référencé peut l'être, donc les deux options (exactement équivalentes) sont :

const MixerDevice& parentMixer
MixerDevice const& parentMixer

(Il est à noter que le const la qualification de MixerDevice peut se faire d'une manière ou d'une autre, et cela signifie exactement la même chose).

0voto

Oli Charlesworth Points 148744

Les valeurs des pointeurs peuvent être assignées aux pointeurs, mais pas aux références ! 1

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

1. Ils peuvent être utilisés pour initialiser des références à des pointeurs, mais ce n'est pas ce que vous avez ici...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X