Preguntas de POO (Programación Orientada a Objetos) - página 9

 
Integer:

Esto significa que tienes que crear una instancia utilizando el operador new.
Hay una cosa que no entiendo. ¿Cuáles son las razones de peso para utilizar el nuevo operador? No puedes hacerlo sin él, ¿verdad?
 
hoz:
Hay una cosa que no entiendo. ¿Qué buenas razones hay para forzar el uso del nuevo operador? ¿Está bien sin ella?


Es necesario si se quieren crear objetos de forma dinámica. Si no se sabe de antemano cuántos objetos y qué tipos de objetos se van a necesitar.

 
hoz:
Так я вот одного не пойму. Какие веские причины принуждают к использованию оператора new ? Без него типа никак?
Integer:
Es necesario si necesitas crear objetos de forma dinámica. Si no se sabe de antemano cuántos objetos y qué tipos de objetos se necesitan.

Puede utilizar matrices de clases dinámicas. En MQL esto funcionará. En C++, puede haber problemas con la inicialización de los miembros de la clase. Por eso es mejor poner un puntero inteligente en el array. Para no tener que lidiar con la inicialización de la clase y la limpieza de la memoria.

 
mql5:
class cFather
 {
 public:
 int GetData() {return 3;}
 };
 //+------------------------------------------------------------------+
 //| |
 //+------------------------------------------------------------------+
 class cChild : public cFather
 {
 public:
 int GetData() {return 5;}
 };

 int f(cFather *p) {return p.GetData();}
 //+------------------------------------------------------------------+
 //| |
 //+------------------------------------------------------------------+
 int OnStart()
 {
 cChild obj,*ptr=GetPointer(obj);
 f(ptr); // вернет 3
 ((cFather *)ptr).GetData(); // вернет 3

 return 0;
 }

¿Cómo se "lee" esta construcción?

((cFather *)ptr).GetData();

Ah, en particular:

(cFather *)ptr)
Lo estoy mirando y no entiendo lo que está pasando...
 
hoz:

¿Cómo se "lee" esta construcción?

((cFather *)ptr).GetData();

ptr se convierte a tipo (clase) cFather y se llama a sumétodo (cFather ) GetData()

algo así...

 
keekkenen:

ptr se convierte a tipo (clase) cFather y se llama a sumétodo (cFather ) GetData()

algo así...

Eso es algo raro... Lo pensé aproximadamente, pero... es demasiado para ser lanzado a un tipo (clase). De todas formas, en programación, por lo que he oído, no es recomendable hacer castings a un tipo (clase). Pero no se trata sólo de una conversión de tipo estándar, sino de una conversión de clase.

Bien, volvamos a este código una vez más:

class cFather
 {
 public:
 int GetData() {return 3;}
 };
 //+------------------------------------------------------------------+
 //| |
 //+------------------------------------------------------------------+
 class cChild : public cFather
 {
 public:
 int GetData() {return 5;}
 };

 int f(cFather *p) {return p.GetData();}
 //+------------------------------------------------------------------+
 //| |
 //+------------------------------------------------------------------+
 int OnStart()
 {
 cChild obj,*ptr=GetPointer(obj);
 f(ptr); // вернет 3
 ((cFather *)ptr).GetData(); // вернет 3

 return 0;
 }

Aquí en los parámetros del prototipo de la función f podemos ver claramente que la función f toma un método de la clase cPadre en sus parámetros. Además, vemos la siguiente situación en el código START:

 f(ptr); // вернет 3

Aquí es donde la función f toma un puntero a la clase cChild, en lugar de un método de la clase cFather. Desde cChild obj, *ptr = GetPointer( obj );

¿Cuál es la lógica de esto?

 

mm... ¿lógica dónde?

en el método f(), creo que la lógica es que el parámetro entrante se procese correctamente para cFather (o sus descendientes)

 
keekkenen:

mm... ¿lógica dónde?

en el método f(), creo que la lógica es que el parámetro entrante se maneje correctamente para cFather (o sus sucesores)

Es decir

 int f(cFather *p) {return p.GetData();}

aquí *p es un puntero a cFather?

Al mismo tiempo, estoy estudiando C++ y estoy un poco confundido por un vocabulario similar. Sin embargo, los punteros no son lo mismo aquí.

 
hoz:

Es decir

aquí *p es un puntero a cFather?

Al mismo tiempo, estoy estudiando C++ y estoy un poco confundido por un vocabulario similar. Sinembargo, los punteros no son los mismos.

cPadre es un tipo de puntero. La propia variable puntero apunta a una instancia de la clase.
 

Hace un par de semanas que no tengo ninguna pregunta. Decidí preguntarlo. No es demasiado complicado, pero lógicamente me pregunto si es una opción. Aquí está el código:

struct Name
  {
   string            first_name;                 // имя
   string            last_name;                  // фамилия
  };
class CPerson
  {
protected:
   Name              m_name;                     // имя
public:
   void              SetName(string n);
   string            GetName(){return(m_name.first_name+" "+m_name.last_name);}
private:
   string            GetFirstName(string full_name);
   string            GetLastName(string full_name);
  };
void CPerson::SetName(string n)
  {
   m_name.first_name=GetFirstName(n);
   m_name.last_name=GetLastName(n);
  }
string CPerson::GetFirstName(string full_name)
  {
   int pos=StringFind(full_name," ");
   if(pos>0) StringSetCharacter(full_name,pos,0);
   return(full_name);
  }
string CPerson::GetLastName(string full_name)
  {
   string ret_string;
   int pos=StringFind(full_name," ");
   if(pos>0) ret_string=StringSubstr(full_name,pos+1);
   else      ret_string=full_name;
   return(ret_string);
  }

Sólo hay 2 funciones públicas en este código:

public:
   void              SetName(string n);
   string            GetName(){return(m_name.first_name+" "+m_name.last_name);}

Y las 2 funciones privadas son llamadas directamente a través de la función pública, o mejor dicho, la función pública, en el momento de la necesidad. Lo interesante es que la función void SetName(string n) tiene el parámetro n, pero ambos métodos privados: string GetFirstName(string full_name) y string GetLastName(string full_name) por alguna razón no tienen el mismo parámetro. Aunque si tomas este mismo código (no el otro), los métodos privados son llamados a través de los públicos con los mismos parámetros y no hay otra forma. Entonces, ¿por qué debería dar nombres diferentes a los parámetros?

Espero que la pregunta esté clara.

Razón de la queja: