Как помочь студентке по инфо-тематике? - страница 10

 
Vladislav Boyko #:
хотя я и там умудрился намазать.

В приличном обществе _check(a) был бы методом, я правильно понимаю?

Наверное,  _check мог бы послужить хрестоматийным примером function-like macros😄

Лично мне иногда просто не хочется раздувать класс дополнительным методом, из-за чего я злоупотребляю макросами.

 
Vladimir Simakov #:
если реально боишься когда-либо забыть в двух местах проапгрейдить, данные оборачиваются в структуру, а у структуры делается два конструктора, один копированием, в котором this = other, а вот другой, тот, который все значения должен принять. Соответственно, проапгрейдить тебе нужно только параметрический конструктор структуры, а дальше уже компилятор тебе на все места укажет.

Не очень понимаю, о чем вы говорите. Не могли бы вы показать небольшой пример?

Я в свое время когда боялся забыть проапгрейдить делал примерно так:

struct Test
  {
private:
   void assign(bool a_sunday, bool a_monday, bool a_tuesday);
public:
   bool sunday;
   bool monday;
   bool tuesday;
        Test(bool a_sunday, bool a_monday, bool a_tuesday) { assign(a_sunday, a_monday, a_tuesday);          }
        Test(const Test &from)                             { assign(from.sunday, from.monday, from.tuesday); }
  };

void Test::assign(bool a_sunday,bool a_monday,bool a_tuesday)
  {
   sunday = a_sunday;
   monday = a_monday;
   tuesday = a_tuesday;
  }

Но позже перестал так делать - не очень удобно и поля нельзя сделать константными (я понимаю, что можно саму структуру потом константным полем сделать).

P.S.

Я, кажется, понял:

struct Test
  {
public:
   bool sunday;
   bool monday;
   bool tuesday;
        Test(const Test &other) { this = other; }
        Test(bool a_sunday, bool a_monday, bool a_tuesday);
  };

Test::Test(bool a_sunday,bool a_monday,bool a_tuesday)
  {
   sunday = a_sunday;
   monday = a_monday;
   tuesday = a_tuesday;
  }

Но неявно перегруженный operator= мне тоже страшновато использовать😄 А явно перегрузить - возврат к первому коду этого поста, грубо говоря.

P.S.2

Да, если захочется явно перегрузить, то вся защита нивелируется.

struct Test
  {
public:
   bool sunday;
   bool monday;
   bool tuesday;
   void operator=(const Test &other);
        Test(const Test &other) { this = other; }
        Test(bool a_sunday, bool a_monday, bool a_tuesday);
  };

void Test::operator=(const Test &other)
  {
   sunday = other.sunday;
   monday = other.monday;
   //tuesday = other.tuesday;
  }

Test::Test(bool a_sunday,bool a_monday,bool a_tuesday)
  {
   sunday = a_sunday;
   //monday = a_monday;
   tuesday = a_tuesday;
  }

С явно перегруженным остается только к assign() возвращаться:

   void operator=(const Test &other) { assign(other.sunday, other.monday, other.tuesday); }

Ну или...😄😄😄

#define _assign

 

Vladislav Boyko #:
Я, кажется, понял:

struct Test
  {
        Test(const Test &other) { this = other; }

В контексте MQL может иметь смысл.

C++, на сколько я понимаю, умеет генерировать неявный конструктор копирования; в этом случае вызов неявного operator= из явного конструктора копирования мне непонятен - можно ведь просто неявным конструктором копирования пользоваться. Но я не знаю C++, возможно я заблуждаюсь.