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

 
Andrey Dik #:
никак не получается заставить работать Print (), что я делаю не так?
void OnStart()
{
  C_Ind* inds [] = {new C_AVE1, new C_AVE2};

  for (int i = 0; i < 2; i++)
  {
  inds [i].InitI ();
    delete inds[i];
  }    
}
 
удалось победить так:
input double I1 = 1.1;
input double I2 = 2.2;

class C_Ind
{
  public: virtual int Init () {return 0;}
};

class C_AVE1 : public C_Ind
{
  public: int Init ()
  {
    double a = I1;
    Print (a);

    return 1;
  }
};

class C_AVE2 : public C_Ind
{
  public: int Init ()
  {
    double a = I2;
    Print (a);

    return 1;
  }
};

void OnStart()
{
  C_Ind *ave1 = new C_AVE1 ();
  C_Ind *ave2 = new C_AVE2 ();

  C_Ind *inds [2];// = {ave1, ave2}; //так нельзя
  
  inds [0] = ave1;
  inds [1] = ave2;

  for (int i = 0; i < 2; i++)
  inds [i].Init ();
  
  for (int i = 0; i < 2; i++)
  delete inds [i];
}
 
fxsaber #:
о! пока писал пост - Вы раньше предложили.)
Ваш способ инициализации массива даже удобнее, спасибо!
 
Andrey Dik #:
о! пока писал пост - Вы раньше предложили.)
Ваш способ инициализации массива даже удобнее, спасибо!

Это неудобно хотя бы тем, что при таком способе явная (!) ошибка компилятором не обнаруживается:

 C_Ind* inds [] = {((const C_Ind *)new C_AVE1), ((const C_Ind *)new C_AVE2)}; //нормально???

А в Вашем "неудобном" (а на самом деле более правильном) способе компилятор сразу о ней сообщит в случае чего:

inds [0] = ((const C_Ind *)new C_AVE1); //Error: '=' - cannot convert from const pointer to nonconst pointer
inds [1] = ((const C_Ind *)new C_AVE2); //Error: '=' - cannot convert from const pointer to nonconst pointer
 
class A {};

void OnStart()
{
  const A* a1[];
  A* a2[];
  
  ArrayResize(a1, ArrayResize(a2, 1));

  a2[0] = a1[0]; //'=' - cannot convert from const pointer to nonconst pointer
  
  a2[0] = (A*)a1[0]; //OK
  Print(ArraySwap(a2, a1)); // true  
  Print(ArrayCopy(a2, a1)); // 1
}
 
A100 #:

Это неудобно хотя бы тем, что при таком способе явная (!) ошибка компилятором не обнаруживается:

А в Вашем "неудобном" (а на самом деле более правильном) способе компилятор сразу о ней сообщит в случае чего:

Это для меня очень сложно, к сожалению, Вы меня напугали.

Буду разбираться.

Если не трудно, поясните, пожалуйста, в чем может быть проблема при такой инициализации и как она проявится?

 
Andrey Dik #:

Это для меня очень сложно, к сожалению, Вы меня напугали.

Буду разбираться.

Если не трудно, поясните, пожалуйста, в чем может быть проблема при такой инициализации и как она проявится?

Проблема может быть в трудноуловимой ошибке (там где Вы ее и не ожидаете вовсе). Я сообщал ранее Разработчикам об этом, но они длительное время не исправляют, а значит лучше воздержаться от такого способа {} инициализации, благо что есть традиционный, через =

 
fxsaber #:
ArraySwap

Правильно! ArraySwap нужно запретить в принципе, потому что он нарушает константность

 
A100 #:

Проблема может быть в трудноуловимой ошибке (там где Вы ее и не ожидаете вовсе). Я сообщал ранее Разработчикам об этом, но они длительное время не исправляют, а значит лучше воздержаться от такого способа {} инициализации, благо что есть традиционный, через =

Понятно. Жаль, потому что при "=" придется сначала объявлять объекты а потом присваивать массиву, это увеличит код как минимум в два раза (хотя, благо, это нужно сделать всего один раз, а далее просто обращаться к массиву через цикл).
 
A100 #:

Откуда такие сведения?

Достаточно в базовом

Спасибо. Нужно будет проверить. Всегда объявлял в производных тоже виртуальными. Просто потому, что когда-то не сработал вызов метода из производного. Объявил виртуальным и заработало. Могу ошибаться в причине из-за давности описываемых событий (может и сигнатура была иной - не помню уже). Но теперь всегда виртуальные методы делаю во всех классах виртуальными, и проблем не имею.