Использование перегрузки оператора присваивания для возврата задания из класса - PullRequest
0 голосов
/ 29 октября 2018

Я использую API вызова JNI, и я хотел бы иметь возможность выполнить следующее назначение в моей функции main ():

jobject Myjobject = MyClassInstance;

Где MyClassInstance - это экземпляр объекта MyClass.

MyClass.h:

// DEFINE OVERLOADED = OPERATOR //
    jobject operator= (const MyClass &);

MyClass.cpp:

jobject MyClass::operator =(const MyClass & MyInstance)
{
    return MyInstance.jobjectMember;
}

Где jobjectMember - частный участник MyClass.

Тем не менее, я продолжаю получать следующую ошибку во время компиляции:

ошибка: невозможно преобразовать «MyClass» в «jobject {aka _jobject *}» в Назначение

Куда я иду не так?

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Просто объясняю , почему ваш код не работает (как решить: см. VTT ' ответ ):

jobject MyClass::operator=(const MyClass& MyInstance)
{
    return MyInstance.jobjectMember;
}

Это позволит назначить экземпляр MyClass, назначить другой экземпляр & ndash; ну, MyClass:

MyClass x, y;
x = y;

Однако теперь, хотя код может быть законным, он, по крайней мере, очень необычный, я бы скорее сказал, что он нарушает передовой опыт или общие соглашения: как правило, оператор присваивания возвращает назначаемый объект & ndash; правильного типа и по ссылке:

MyClass& MyClass::operator=(const MyClass& other)
{
    return *this;
}

Это позволит делать такие вещи:

MyClass x, y, z;
x = y = z;

это то, что люди ожидают от назначения. Ваш вариант, напротив, позволит:

jobject o;
MyClass x, y;
o = x = y; // ???

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

MyClass& MyClass::operator=(MyClass const& other)
{
    jobjectMember = other.jobjectMember;
    return *this;
}

Наконец: если вы уже пишете пользовательские операторы присваивания, взгляните на правило из трех и правило из пяти , они могут помочь вам избежать некоторых проблем в будущем.

0 голосов
/ 29 октября 2018

Чтобы jobject Myjobject = MyClassInstance; (что является инициализацией, а не присваиванием) работало, вам нужно определить соответствующий конструктор для jobject класса.

class jobject
{
    public: explicit
    jobject(MyClass const & that) {...}

или определить оператор преобразования для MyClass

  class MyClass 
  {
      public: explicit
      operator jobject const &(void) const
      {
          return this->jobjectMember;
      }

  jobject Myjobject{static_cast<jobject const &>(MyClassInstance)};
...