2

При перегрузке оператора присваивания выдает ошибку:

error C2440: return: невозможно преобразовать "FlyLevel" в "FlyLevel ^"

ref class FlyLevel
{
private:
    String ^mIdCfl; 
    double mMeters; 
    double mFoot;   
public:
    FlyLevel();
    FlyLevel (String ^idCfl, double meters, double foot);
    String ^get_IdCfl();   
    double Meters();    
    double Foot();       
    FlyLevel ^operator = (const FlyLevel ^rhs);
    {
        mIdCfl = rhs->mIdCfl;
        mMeters = rhs->mMeters;
        mFoot = rhs->mFoot;
        return  *this;
    }
 };

Как правильно перегрузить оператор присваивания?

Qwertiy
  • 123,725
bastet
  • 37

2 Answers2

2

Есть два решения:

FlyLevel ^operator = (const FlyLevel ^rhs);
{
    mIdCfl = rhs->mIdCfl;
    mMeters = rhs->mMeters;
    mFoot = rhs->mFoot;
    return this;
}
void operator = (const FlyLevel ^rhs);
{
    mIdCfl = rhs->mIdCfl;
    mMeters = rhs->mMeters;
    mFoot = rhs->mFoot;
}

Интересно, что в обоих случаях следующий код компилируется:

FlyLevel ^a = gcnew FlyLevel("", 0, 0), ^b = gcnew FlyLevel("", 0, 0), ^c;
c = a = b;

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

Qwertiy
  • 123,725
  • Возможно, инициализация не считается присваиванием, как и в обыкновенном C++. – VladD Mar 12 '17 at 12:55
  • @VladD, вероятно фишка в том, что мы присваиваем указатель, а оператор перегружен для класса? При чём тут инициализация, я не понял. c=a=b - это не инициализация. – Qwertiy Mar 12 '17 at 19:11
  • И правда, c = a = b — не инициализация. Тогда я и не знаю, что думать. – VladD Mar 12 '17 at 20:36
  • @VladD, но ведь присваивается указатель. Неразыменованный. Надо как-то по-другому? – Qwertiy Mar 12 '17 at 20:54
1

Помимо предложных выше решений, такой вариант тоже сработал:

FlyLevel %operator = (const FlyLevel %rhs)  
{
    mIdCfl = rhs.mIdCfl;
    mMeters = rhs.mMeters;
    mFoot = rhs.mFoot;
    return  *this;
}
bastet
  • 37