Конст правильность и оператор * - PullRequest
0 голосов
/ 20 января 2012

Я определил класс следующим образом:

Quaternion& conjugate();        //negates the vector component of the quaternion
Quaternion  conjugate() const;  //same but in without modifying the class...

Quaternion& operator =  (Quaternion const& Qrhs);
Quaternion& operator *= (Quaternion const& Q);
Quaternion  operator  *  (Quaternion const& Qrhs) const;

Теперь я использую следующие функции:

PRINTVAR(*this);                //this is the first time printed (a little macro to print line and file)
Quaternion vQ(0.,vn), resQ;
resQ = vQ*(this->conjugate());  //this is the method I want to discuss...
PRINTVAR(*this);                //this is the second time
resQ = *this * resQ;

и это вывод

*this: (0:0:0:0) at line: 128 in file: Quaternions.cpp
*this: (-0:-0:-0:0) at line: 131 in file: Quaternions.cpp

Я думал, что позвонив оператору * в строке resQ = vQ*(this should be called as const)... почему если я печатаю *this снова меняется?

Вот определение сопряженной функции:

Quaternion& Quaternion::conjugate(){
/* Given:  Nothing
 * Task:   Invert sign of the vector
 * Return: the class which will be modified
*/
    V3 vec;
    vec = -(this->getVector());
    x() = vec[0];
    y() = vec[1];
    z() = vec[2];
    return *this;
}

Quaternion Quaternion::conjugate() const{
    Quaternion result(*this);
    result.conjugate();
    return result;
}

Ответы [ 3 ]

3 голосов
/ 20 января 2012

Если код, который вы показали, использует неконстантный метод, то указатель this не является константным, а неконстантный метод conjugate, конечно, лучше, чем константный. Типы возврата не учитываются при принятии решения о перегрузке. Если вы хотите настаивать на использовании версии const, вы можете добавить constness: resQ = vQ*(static_cast<const Quaternion*>(this)->conjugate());

0 голосов
/ 20 января 2012

* это не const (хотя он используется в методе const), и c ++ FAQ Lite указывает состояние перегрузки const (в случае FAQ по оператору индекса);

Когда вы применяете оператор индексации к объекту MyFredList, который неконстантный, компилятор вызовет неконстантный оператор индекса.

Переведено, поскольку * это неконстантный, будет вызван неконстантный метод.

0 голосов
/ 20 января 2012

Вероятно, метод, в котором вы используете this, не является постоянным.

Тип this функции-члена типа A, A * const. Для функции-члена const это const A * const.

Следовательно, ваш код будет работать так, как вы ожидаете, если вы введете свой код в метод const.

Если вы хотите вызвать перегруженную функцию вызова const, вам нужно выполнить const-cast:

  const_cast<const Quaternion * const>(this)->conjugate();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...