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

 
1. Вопрос начального уровня.
class A
{
public:  
  virtual string GetMyName() const
  {
    return(typename(this));
  }
};

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

void OnStart()
{
  B1 b1;
  B2 b2;
  B3 b3;
  
  Print(b1.GetMyName()); // class A const, надо class B1 const
  Print(b2.GetMyName()); // class A const, надо class B2 const
  Print(b3.GetMyName()); // class A const, надо class B3 const
}
Возможно ли без копи-пасты виртуального метода в каждый класс получить нужный результат (см. комментарий в исходнике).
 

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

class A {};

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

void OnStart()
{
  A* a[3];
  
  a[0] = new B1;
  a[1] = new B2;
  a[2] = new B3;
  
  for (int i = 0; i < 3; i++)
    a[i] = new // ???? - как в цикле задать?
}

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

 

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

class A {};

class B : public A {};

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

void OnStart()
{
  B b;
  A* a = &b; // B-объект в A*.
  
  A* a2 = New(&b); // Здесь делается new B.
  A* a3 = New(a);  // Здесь делается new A, а надо new B.    
}

Нужно суметь создать такой же объект, на какой ссылается базовый указатель.

 
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> {};

Только так.