Ошибка -1008. Нельзя заранее объявлять классы, если потом не объявляешь их окончательно.

 

Упростил уже до безобразия, и отловил интересную ситуацию.

Имеем два файла.

Файл самого будущего советника, в нем один #include и одна функция Инит, возвращающая нуль:

#include "MyData.mqh"

int OnInit()
  {
  return(0);
  }

   

Файл MyData тоже очень простой:

// class CFoo;              // ОБРАЩАЕМ ВНИМАНИЕ НА ЭТУ ПОКА ЗАКОММЕНТАРЕННУЮ ДЕКЛАРАЦИЮ.

class CAdvisorData

{
public:

double               m_dFirstData;

double               m_dSecondData;
};


Все замечательно компилируется и запускается.

Но как только во втором файле раскомментариваем форвардную декларацию класса - все по-прежнему прекрасно компилируется, но при попчтке запуска вылетает сообщение "internal error #-1008, EX5 write error".

Какие мысли, где я допустил ляпсус ?

Вроде как форвардная декларация не должна ничего менять...   

 

а если упростить еще больше - перенести все в один файл к OnInit и убрать поля double

 
sergeev:

а если упростить еще больше - перенести все в один класс и убрать поля double

Не вполне понял, что переносить в один класс. Закомментаренную декларацию ?

И поля дубль - если убрать, то оставить пустой класс CAdvisorData ? 

 
Laryx:

Не вполне понял, что переносить в один класс. Закомментаренную декларацию ?

И поля дубль - если убрать, то оставить пустой класс CAdvisorData ? 

не класс, а файл
 

sergeev:
не класс, а файл 

Тоже самое получается. 

 

 А ! Разобрался.   

Форвардная декларация класса требует обязательного последующего объявления такого класса, даже если этот класс нигде не используется. (В реальном коде я его объявил просто на будущее, пока еще нигде не использую). Как только  класс СFoo был описан в конце файла - тут же ошибка исчезла. 

  

Сейчас исправлю название темы.  А... Уже не могу исправить. Ну, пусть модератор исправит. Нельзя заранее объявлять классы, если потом не объявляешь их окончательно.

Наверно надо в сервисдеск послать, чтобы ошибка вылетала более осмысленная, типа "отсутствие класса, описанного в форвардной декларации". 

....

Написал предложение в Сервисдеск. 

 

Спасибо за сообщение, исправлено.
Причина обращения: