Оператор присваивания C ++ для копирования между энергозависимыми и энергонезависимыми экземплярами класса - PullRequest
0 голосов
/ 12 марта 2020

Я хотел бы скопировать в обоих направлениях между энергозависимыми и энергонезависимыми экземплярами класса. Далее используется оператор присваивания для копии. Если макрос «normal_ cpp» определен, все компилируется должным образом. Если макрос не определен, что разрешает «volatile», он копирует энергонезависимый в volatile, но с ошибками наоборот и всегда с ошибками при возврате * this.

Я надеюсь, что кто-то может сказать мне правильный синтаксис, чтобы вернуть * это, и как я могу назначить энергонезависимой для энергонезависимой. Спасибо.

#define ordinary_cpp
#ifdef ordinary_cpp
  #define cv_qual
  #define thiserrormacro(arg) arg
  #define hopefulmacro(arg) arg
#else
  #define cv_qual volatile
  #define thiserrormacro(arg)
  #define hopefulmacro(arg)
#endif

struct Class {
  int data;
  Class operator = ( Class lhs ) cv_qual {
    data = lhs.data;
    thiserrormacro(return *this;)
  }
};

void test(){
  Class         nonvol;
  Class cv_qual vol;

  vol = nonvol;

  hopefulmacro(nonvol = vol;)
}

1 Ответ

1 голос
/ 12 марта 2020

Вам нужно 4 перегрузки, для

nonvol = nonvol;
nonvol = vol;
vol = nonvol;
vol = vol;

Это будет что-то вроде

struct Class {
  int data;
  Class& operator = ( const Class& lhs ) {
    data = lhs.data;
    return *this;
  }
  volatile Class& operator = ( const Class& lhs ) volatile {
    data = lhs.data;
    return *this;
  }
  Class& operator = ( const volatile Class& lhs ) {
    data = lhs.data;
    return *this;
  }
  volatile Class& operator = ( const volatile Class& lhs ) volatile  {
    data = lhs.data;
    return *this;
  }
};

Но не беспокойтесь. volatile на данный момент довольно рудиментарен, и это определенно не означает «безопасно использовать с потоками» .

...