перекрестные ссылки

 

Здравствуйте!

class Manager;
class Employee;

class Manager 
{
 public:
   Employee * meEmployee;    
   Manager()
   {
      
      this.meEmployee=new Employee();
      this.meEmployee.meManager=&this;  // ОК
//      this.meEmployee.meManager=this; // CRITICAL RUN TIME ERROR
   };
};

class Employee 
{
 public:
   Manager  *meManager; 
};

void OnStart()
{
  Manager lM();
  printf("Yes"); 
}

поясните, пожалуйста, причину появления критической ошибки времени выполнения в случае, если присвоение выполняется без &

 
Nikolai Karetnikov:

Здравствуйте!

поясните, пожалуйста, причину появления критической ошибки времени выполнения в случае, если присвоение выполняется без &

ИМХО. Тут ошибка компиляции должна быть. Модераторы, перенесите в тему с ошибками.

 
Vladimir Simakov:

ИМХО. Тут ошибка компиляции должна быть. Модераторы, перенесите в тему с ошибками.

Надо сначала проверять, а потом писать. ИМХО в программировании не катит, все компилируется при раскомменчивании в Manager() .

Топикстартеру: посмотрите в дебаггере значение this в конструкторе Manager(). Вот так работает.

class Manager;
class Employee;

class Manager 
{
 public:
   Employee * meEmployee;    
   Manager()
   {
      
      this.meEmployee=new Employee();
      //this.meEmployee.meManager=&this;  // ОК
      //this.meEmployee.meManager=this; // CRITICAL RUN TIME ERROR
   };
};

class Employee 
{
 public:
   Manager  *meManager; 
};

void OnStart()
{
  printf("start"); 
  Manager lM();
  lM.meEmployee.meManager = &lM;
  printf("Yes"); 
}
  
 
Alexey Volchanskiy:

Надо сначала проверять, а потом писать. ИМХО в программировании не катит, все компилируется при раскомменчивании в Manager() .

Топикстартеру: посмотрите в дебаггере значение this в конструкторе Manager(). Вот так работает.

Алексей, то ли я ваш ответ не понял, то ли вы не поняли мой вопрос )

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

this.meEmployee.meManager=&this;

обязательно должен присутствовать знак &. Почему без знака &, принимающая сторона - this.meEmployee.meManager не может получить указатель на объект this ?

 
В MQL this это ссылка, а Вы хотите её присвоить указателю.
Странно, что ошибка возникает во время выполнения.
Она должна быть уже при компиляции.

 
Koldun Zloy:
В MQL this это ссылка, а Вы хотите её присвоить указателю.

если не затруднит, объясните, что в MQL значит:

& this

справка очень туманная по этому вопросу https://www.mql5.com/ru/docs/basis/types/this

 
Koldun Zloy:
В MQL this это ссылка, а Вы хотите её присвоить указателю.
...

Спасибо! Приму к сведению

 
Igor Makanu:

если не затруднит, объясните, что в MQL значит:

справка очень туманная по этому вопросу https://www.mql5.com/ru/docs/basis/types/this

Это операция взятия адреса. То же самое что и функция GetPointer().

 
Koldun Zloy:

Это операция взятия адреса. То же самое что и функция GetPointer().

это я знаю

я физический смыл никак не пойму, по докам в MQL нет доступа к адресному пространству. указатели это идентификаторы и разыменование указателя отсутствует в MQL

это все понятно и стыкуется объяснениями из справки включая 

this

но что значит ?

&this
или
GetPointer(this)
 
Igor Makanu:

это я знаю

я физический смыл никак не пойму, по докам в MQL нет доступа к адресному пространству. указатели это идентификаторы и разыменование указателя отсутствует в MQL

это все понятно и стыкуется объяснениями из справки включая 

но что значит ?

Просто в MQL это не физический адрес, а дескриптор.

 
Koldun Zloy:

Просто в MQL это не физический адрес, а дескриптор.

да дескриптор, не идентификатор как написал

но чем отличаются вызовы методов в этом коде ?

//+------------------------------------------------------------------+
class A
{
private:
   int               value;
public:
                     A(): value(0)        {             }
   void              setValue(const int v){value = v;   }
   int               getValue(void)       {return value;}
};
//+------------------------------------------------------------------+
void OnStart()
{
   A *a = new A;
   a.setValue(123);
   
   A *b = a;
   A *c = GetPointer(a);
   
   Print("b = ",b.getValue());   // b = 123
   Print("c = ",c.getValue());   // c = 123
   
   delete a;
   delete b;
   delete c;
}
//+------------------------------------------------------------------+