Можно ли в классе объявить вложенной структуру?

 

Хотел написать так примерно?

class ZZHandling {
  private:
  //---- Конструктор и деструктор
  public:
    ZZHandling();
   ~ZZHandling();
    //------------------------------------   Функции для выполнения операций с данными Zig-Zag'a   ----------------------------------------
    struct ZZProperty;
};

//+---------------------------------------------------------------------------------------------------------------------------------------+
//|                                               Структура данных экстремумов Зиг-зага                                                   |
//+---------------------------------------------------------------------------------------------------------------------------------------+
struct ZZHandling :: ZZProperty {
  int    barIndex;
  double price;
};

Компилятор ругается:

';' - name expected     ZZHandling.mqh  26      22
'ZZHandling' - class type expected      ZZHandling.mqh  40      8
see previous declaration of 'ZZHandling'        ZZHandling.mqh  19      7
'ZZHandling' - identifier already used  ZZHandling.mqh  40      8
see previous declaration of 'ZZHandling'        ZZHandling.mqh  19      7
'::' - '{' beginning bracket expected   ZZHandling.mqh  40      19
4 error(s), 0 warning(s)                5       1

Да, можно инклюдить структуру. Но не хочется заводить отдельный файл для неё. Хочется в класс поместить и всё. Но что-то не выходит. Это вообще реально сделать?

 
class ZZHandling {
  private:
  //---- Конструктор и деструктор
    struct SZZProperty
    {
      int    barIndex;
      double price;
    };
  public:
    ZZHandling();
   ~ZZHandling();
    //------------------------------------   Функции для выполнения операций с данными Zig-Zag'a   ----------------------------------------
    SZZProperty ZZProperty;
};

Использую подобную конструкцию, но по большому счету смысла нет. В другом классе с подобным именем структуру не создадите, будет ругаться. Как минимум нужно будет что-то добавить, например SZZProperty_.

 
Konstantin Nikitin:

Использую подобную конструкцию, но по большому счету смысла нет.В другом классе с подобным именем структуру не создадите, будет ругаться. Как минимум нужно будет что-то добавить, например SZZProperty_.

Суть понял. В каких-то ситуациях это не вариант. Но в данном случае, всё данные зиг-зага я буду всё-равно хранить в этом классе, поэтому это вариант))

 

Оказалось, не всё так радужно, как я думал. Не всё работает корректно. Начал писать класс.

//+=======================================================================================================================================+
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//|                                            КЛАСС, ХРАНЯЩИЙ И ОБРАБАТЫВАЮЩИЙ ДАННЫЕ Zig-Zag'a                                          |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+=======================================================================================================================================+
class ZZHandling {
  private:
  //---- Конструктор и деструктор
  public:
    ZZHandling();
   ~ZZHandling();
    //------------------------------------   Функции для выполнения операций с данными Zig-Zag'a   ----------------------------------------
  struct ZZProperty {
    int    indexInZZSequence;    // Индекс бара из таймсерии iBars, на котором образован экстремум
    double price;                // Цена Zig-Zag'a на индексе barIndex

    void setData(int pZZIndex, double pPrice) {
      indexInZZSequence = pZZIndex;
      price = pPrice;
    Print("setData");
    }
  };
};
//=========================================================================================================================================
// Конструктор класса. ====================================================================================================================
ZZHandling :: ZZHandling(void) {
}
//=========================================================================================================================================
// Деструктор класса. =====================================================================================================================
ZZHandling :: ~ZZHandling(void) {
}

Вызываю его из эксперта:

//+---------------------------------------------------------------------------------------------------------------------------------------+
//|                                                    Сбор экстремумов Zig-Zag'a                                                         |
//+---------------------------------------------------------------------------------------------------------------------------------------+
void getZZ(int extremumCountToCollect) {
  int cnt = -1;    // порядковый номер Zig-Zag'a
  for (int i = 1; i <= Bars; i++) {
    if (cnt == 4) break;
    double ZZPrice = ND(iCustom(NULL, PERIOD_CURRENT, "ZZ_mtf", i_ZZTF, 0, i));
    if (ZZPrice == EMPTY_VALUE) continue;
    Print("BEFORE ZZSequenceProperties[cnt].setData(i, ZZPrice);");
    ZZSequenceProperties[cnt].setData(i, ZZPrice);
    Print("AFTER ZZSequenceProperties[cnt].setData(i, ZZPrice);");
    cnt++;
  }
}

До строки:

    cnt++;

Не доходит вообще. Соответственно, переменная cnt всегда равно инициализированному значение.

Странно то, что структура же у нас с модификатором доступа public, а значит должна по идее иметь возможность вызываться. Хотя, возможно, в мкл не доделан вариант вызова методов из структур или такого вообще не бывает.

 

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

Структура - это тип данных. Соответственно не совсем правильно описывать тип данных в классе. Описать его нужно отдельно. А в классе - объявить член с ранее описанным типом данных.

Применительно к показанному ранее коду лучше всего сделать так:

struct ZZProperty {
  int    barIndex;
  double price;
};

class ZZHandling {
  private:
  //---- Конструктор и деструктор
  public:
    ZZHandling();
   ~ZZHandling();
    //------------------------------------   Функции для выполнения операций с данными Zig-Zag'a   ----------------------------------------
    ZZProperty  m_stZZProperty;
};
Причина обращения: