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.
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() {return3;}
};
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+class cChild : public cFather
{
public:
int GetData() {return5;}
};
int f(cFather *p) {return p.GetData();}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+intOnStart()
{
cChild obj,*ptr=GetPointer(obj);
f(ptr); // вернет 3
((cFather *)ptr).GetData(); // вернет 3return0;
}
Aquí en los parámetros del prototipo de la funciónf 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 );
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:
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?
Esto significa que tienes que crear una instancia utilizando el operador new.
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.
Так я вот одного не пойму. Какие веские причины принуждают к использованию оператора new ? Без него типа никак?
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.
¿Cómo se "lee" esta construcción?
Ah, en particular:
Lo estoy mirando y no entiendo lo que está pasando...¿Cómo se "lee" esta construcción?
ptr se convierte a tipo (clase) cFather y se llama a sumétodo (cFather ) GetData()
algo así...
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:
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); // вернет 3Aquí 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)
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
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í.
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.
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:
Sólo hay 2 funciones públicas en este código:
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.