11

別のクラス オブジェクトへの参照が引数として渡されることを期待するクラス コンストラクターがあります。ポインター演算が実行されない場合、または null 値が存在しない場合は、ポインターよりも参照が望ましいことを理解しています。

これは、コンストラクターのヘッダー宣言です。

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;
4

4 に答える 4

17

thisはポインタです。参照を取得するには、参照解除 ( *this) する必要があります。

MixerLine mixerLine( *this, i );
于 2012-06-23T14:52:21.523 に答える
3

は参照ではなくポインタであるthisため、逆参照する必要があります。thisコードを修正するには、書く必要があります

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

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

注:constコンストラクターのパラメーターの2 番目const MixerDevice& const parentMixerはまったく役に立ちません。

于 2012-06-23T15:11:35.920 に答える
1

ポインターから参照を取得するには、既に述べたように、ポインターを逆参照する必要があります。さらに(おそらく質問へのコピーが原因でしょうか?)コンストラクターはコンパイルしないでください:

const MixerDevice& const parentMixer

これは適切な型ではありません。参照を const 修飾することはできません。修飾できるのは参照される型のみです。したがって、2 つの (まったく同等の) オプションは次のとおりです。

const MixerDevice& parentMixer
MixerDevice const& parentMixer

const(の修飾はMixerDeviceどちらの方法でも実行でき、まったく同じことを意味することに注意してください)。

于 2012-06-23T15:20:47.430 に答える
0

ポインター値はポインターに代入できますが、参照には代入できません! 1

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


1.まあ、それらはポインターへの参照を初期化するために使用できますが、それはあなたがここに持っているものではありません...

于 2012-06-23T14:52:09.480 に答える