Ошибки, баги, вопросы - страница 1696

 
Stanislav Korotky:

Во-первых, не понятно, была ли попытка объявить метод виртуальным или нет. Если он должен быть виртуальным, то пишите virtual в базовом классе, а не в производном (потому что иначе базовые указатели будут ризолвится на базовый метод даже если положить в него экземпляр производного класса).

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

Наконец, чтобы скрыть метод от класса-наследника нужно ввести промежуточных класс, где этот метод переместить в область priivate или сразу сделать приватным в базовом (но зачем он тогда виртуальный?).

Вот пример

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class roditel
  {
public:

   virtual int one(void)
     {
      return 1;
     }
   virtual int two(void)
     {
      return 2;
     }
   virtual int three(void)
     {
      return 3;
     }
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class naslednic_1 : public roditel
  {
public:
   virtual int       two(void);
   virtual int       three(void);
  };

naslednic_1 go;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   go.two();
// 'two' - function must have a body    TEst.mq4        42      7
  }
//+------------------------------------------------------------------+
 
Vladimir Pastushak:

Вот пример

Этот пример примерно такой же как и первый ;-). Мое письмо отквотили, но не читали? Чего Вы хотите добиться продекларировав методы по-новой в наследнике, но не определив их? Чтобы вызывать базовую реализацию не имея новой, не надо их упоминать в наследнике.
 
Stanislav Korotky:
Этот пример примерно такой же как и первый ;-). Мое письмо отквотили, но не читали? Чего Вы хотите добиться продекларировав методы по-новой в наследнике, но не определив их? Чтобы вызывать базовую реализацию не имея новой, не надо их упоминать в наследнике.

Есть 200 методов в родителе, на основе 10 методов из родительского класса создается класс потомок при дальнейшей работе я хочу видеть только 10 наследованных методов плюс те которые созданы в классе потомке, мне не нужны еще 190 методов которые никаким боком к текущему потомку не должны относиться. 

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

На основе этих методов свойсв я делаю класс наследник круг в котором использую методы из родительского класса, радиус, цвет, площадь... Но мне тут углы и ширина не нужны ...

На основе этих методов свойсв я делаю класс наследник треугольник в котором использую методы из родительского класса,  цвет, площадь, углы ... Но мне тут радиус не нужен ... 

 

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

 
Vladimir Pastushak:

Есть 200 методов в родителе, на основе 10 методов из родительского класса создается класс потомок при дальнейшей работе я хочу видеть только 10 наследованных методов плюс те которые созданы в классе потомке, мне не нужны еще 190 методов которые никаким боком к текущему потомку не должны относиться. 

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

На основе этих методов свойсв я делаю класс наследник круг в котором использую методы из родительского класса, радиус, цвет, площадь... Но мне тут углы и ширина не нужны ...

На основе этих методов свойсв я делаю класс наследник треугольник в котором использую методы из родительского класса,  цвет, площадь, углы ... Но мне тут радиус не нужен ... 

 

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

Не понял: этот вопрос - вопрос или недописанный ответ? Обычно делают так - в базовом классе общее, а потом в потомках добавляют частности. Зачем делать наоборот? Какая цель?

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

 
Вопрос к администрации, когда можно будет увидеть новую актуальную статистику по сервисам?
 
Vladimir Pastushak:

Есть 200 методов в родителе, на основе 10 методов из родительского класса создается класс потомок при дальнейшей работе я хочу видеть только 10 наследованных методов плюс те которые созданы в классе потомке, мне не нужны еще 190 методов которые никаким боком к текущему потомку не должны относиться. 

Для этого нужно объявить наследование protected или private.  И затем переопределить нужные вам методы.

class naslednic_1 : protected roditel
  {
public:
   virtual int       two(void)   { return roditel::two(); }
   virtual int       three(void) { return roditel::three(); }
  };
 
Alexey Navoykov:

Для этого нужно объявить наследование protected или private.  И затем переопределить нужные вам методы.

Stanislav Korotky:

Не понял: этот вопрос - вопрос или недописанный ответ? Обычно делают так - в базовом классе общее, а потом в потомках добавляют частности. Зачем делать наоборот? Какая цель?

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

 Благодарю Вас.

Алексей, Ваш пример не работает, все равно в наследнике вываливаются методы родителя которые не должны вываливаться.

 


 
Как узнать свой INDICATOR_SHORTNAME? IndicatorGet*-функций нет!
 
Alexey Kozitsyn:
А если изменять короткое имя при создании?

И каждый раз изменять?

Если индикатор содержит индикаторные буферы, то самоидентифицировать себя не сложно, а вот без буферов - не вижу пока решения.

 
fxsaber:
Как узнать свой INDICATOR_SHORTNAME? IndicatorGet*-функций нет!
 Print(MQLInfoString(MQL_PROGRAM_NAME)); возвращает короткое имя индикатора. Если короткое имя не задано - вернётся полное имя.
Причина обращения: