2012-06-23 2 views
2

У меня есть конструктор класса, который ожидает ссылки на другой объект класса, который будет передан в качестве аргумента. Я понимаю, что ссылки предпочтительнее указателей, когда не выполняется арифметика указателя или когда нулевое значение не будет существовать.C++ Передача `this` в метод по ссылке

Это объявление заголовка конструктора:

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 терпит неудачу с этой ошибкой :

Error 3 error C2664: 'MixerLine::MixerLine(const MixerDevice &,DWORD)' : cannot convert parameter 1 from 'MixerDevice *const ' to 'const MixerDevice &'

Но я думал, что значения указателей могут быть назначены указателям, например

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

'const MixerDevice & const parentMixer' второй' const' не нужен, поскольку ссылки (в отличие от указателей) не могут быть повторно установлены для ссылки на другой объект. – Praetorian

ответ

8

this является указателем, чтобы получить ссылку вы должны разыменования (*this) это:

MixerLine mixerLine(*this, i); 
0

Значения указателя могут быть назначены указателям, но не ссылки!

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


1. Ну, они могут быть использованы для инициализации ссылки-на-указатели, но это не то, что вы здесь ...

2

вы должны разыменовать this , потому что this является указателем, а не ссылкой. Чтобы исправить код, который вы должны написать

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

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

Примечание: второй const в параметре конструктора const MixerDevice& const parentMixer совершенно бесполезно.

1

Для получения ссылки с помощью указателя необходимо указать dereference указатель, как уже упоминалось. Кроме того (? Может быть связано с копированием в вопрос) конструктор не должен составлять:

const MixerDevice& const parentMixer 

Это не правильный тип ссылки не может быть константной квалифицирован, только упомянутый тип может быть, таким образом, два (точно эквивалентны) варианты:

const MixerDevice& parentMixer 
MixerDevice const& parentMixer 

(Обратите внимание, что const квалификационный MixerDevice можно сделать в любом случае, и это означает, что точно так же).

+0

Да, я удалил второй модификатор константы, и теперь он отлично работает. – Dai