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

 
fxsaber #:

Вопрос начального уровня.

Все три вопроса возникли по мере решения такой задачи.
input string inStr = "B2";

class A {};

class B1 : public A {};
class B2 : public A {};
// .....
class B100 : public A {};

void OnStart()
{
  A* a = New(inStr); // создает объект, который прописан в inStr.
}

Нужно написать один раз New и больше не править. При этом можно добавлять B101, B102, ....

ЗЫ Похоже, вопросы не совсем начального уровня. Я не смог решить ни один.

 
fxsaber #:
Все три вопроса возникли по мере решения такой задачи.

Нужно написать один раз New и больше не править. При этом можно добавлять B101, B102, ....

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

input string inStr = "B2";

class A {};

class B1 : public A {};
class B2 : public A {};
class B3 : public A {};

template <typename T>
T* New( string Str )
{
  T* Res = NULL;

#define NEW(B) if ((Res == NULL) && (#B == Str)) Res = new B;
  NEW(B1)
  NEW(B2)
  NEW(B3)
#undef NEW

  return(Res);
}

void OnStart()
{
  A* a = New<A>(inStr); // создает объект, который прописан в inStr.
}
 
fxsaber #:

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


Может, чуток оптимизировать?

template <typename T>
T* New( string Str )
{

#define NEW(B) if ( #B == Str ) return new B;
  NEW(B1)
  NEW(B2)
  NEW(B3)
#undef NEW

  return(NULL);
}
 
PapaYozh #:

Может, чуток оптимизировать?

Спасибо, так лучше.

 
Здравствуйте, ошибочно пополнили баланс MQL 5 на 30 дол, скажите пожалуйста можно ли снять их обратно?
 
fxsaber #:
1. Вопрос начального уровня. Возможно ли без копи-пасты виртуального метода в каждый класс получить нужный результат (см. комментарий в исходнике).
template<typename Type>
class A
{
public:  
  virtual string GetMyName() const
  {
    return(typename(Type));
  }
};

class B1 : public A<B1> {};
class B2 : public A<B2> {};
class B3 : public A<B3> {};

Только так.

 
fxsaber #:

2. Вопрос начального уровня.

Нужно задать элементы массива в цикле (см. комментарий в исходнике).

class B1;
class B2;
class B3;

class A {
public:
   static A* Make(int i){
      switch(i){
         case 0: return new B1;
         case 1: return new B2;
         case 2: return new B3;
         default: return NULL;
      }
   }
};

class B1 : public A {};
class B2 : public A {};
class B3 : public A {};

void OnStart()
{
  A* a[3];
  
  for (int i = 0; i < 3; i++)
    a[i] = A::Make(i);
}

Фабрика классов

 
Vladimir Simakov #:

Только так.

К сожалению, тогда невозможно использовать универсальный базовый указатель.

A* a = new B1;
 
Vladimir Simakov #:

Фабрика классов

Спасибо, получилось без фабрики.

class A {};

class B1 : public A {};
class B2 : public A {};
class B3 : public A {};

template <typename T>
A* New( void ) { return(new T); }

void OnStart()
{
  typedef A* (*TNew)( void );
  static const TNew FuncNew[] = {New<B1>, New<B2>, New<B3>};
  
  A* a[];
  
  for (int i = ArrayResize(a, ArraySize(FuncNew)) - 1; i >= 0; i--)
    a[i] = FuncNew[i]();  
}
Причина обращения: