¿Es posible implementar un patrón singleton en MQL4? - página 5

 
sergeev:

¿Qué es esto?

Eso es lo que has pedido. Una instancia de una clase... con un modificador externo. Absurdo, por supuesto. Pero...

Eso es lo que has dicho. Pero no he encontrado ninguna necesidad de ello.

sargazo:

¿Pero no sería una buena idea hacer una instancia de una estructura externa?

No entiendo qué tiene que ver el exterior con todo esto. No necesito "hacer" algunos datos para ser compartidos, para que puedan ser incluidos en cualquier otra clase. Y estas variables no deben perder sus valores durante la ejecución del programa, es decir, deben ser estáticas. Me está hablando de la parte externa. ¿Para qué?

 
hoz:

Esto es lo que has pedido. Una instancia de clase... con un modificador externo. Absurdo, por supuesto. Pero...

¿compiló en absoluto?


No necesito "fabricar" unos datos para compartirlos,
como la que usted necesita?
 
sergeev:

¿Compiló en absoluto?

No lo he comprobado. Como lo que se necesita aún no se ha implementado.

sergeev:

¿Qué necesitas?

Voy a repetir lo que necesito... Existe una estructura cuyos miembros deben guardar sus valores durante la ejecución del programa, pero cuando se accede a cualquier método de cualquier clase que utilice esta estructura, los miembros pueden ser modificados. Entiendo que tienen que ser estáticos. Estos miembros deben estar en una sola instancia. Los miembros de esta estructura serán utilizados por muchas clases y por el propio Asesor Experto.

Antes era así:

struct Symbol_Properties
{
   static datetime    gdt_Quote;           // Время поступления последней котировки
   static double      gda_Price [2];       // Текущие рыночные цены (0 - Bid, 1- Ask)
   static double      gd_Spread;           // Размер спреда в пунктах
   static double      gd_Swap;             // Своп
   static double      gd_Comission;        // Комиссия
   static double      gd_Pt;               // Величина одного пункта
   static int         gi_Digits;           // Количество знаков в цене после запятой
   static int         gi_StopLevel;        // Минимально-допустимый уровень стоп-лосса/тейк-профита в пунктах
   static int         gi_FreezLevel;       // Уровень заморозки ордеров в пунктах
};

Symbol_Properties::gdt_Quote = 0;
Symbol_Properties::gda_Price [2] = {0.0, 0.0};
Symbol_Properties::gd_Spread = 0;
Symbol_Properties::gd_Swap = 0;
Symbol_Properties::gd_Comission = 0;
Symbol_Properties::gd_Pt = 0;
Symbol_Properties::gi_Digits = 0;
Symbol_Properties::gi_StopLevel = 0;
Symbol_Properties::gi_FreezLevel = 0;

Pero, en este caso, es inconveniente referirse a tales variables, porque el "nombre" es largo. Es decir

Symbol_Properties::gd_Pt = 0;

¿Cómo ponerlo en práctica?

 
hoz:

Déjame repetir lo que necesito... Existe una estructura cuyos miembros deben guardar sus valores durante la ejecución del programa, pero cuando se accede a cualquier método de cualquier clase que utilice esta estructura, los miembros pueden ser modificados. Entiendo que tienen que ser estáticos. Estos miembros deben estar en una sola instancia. Los miembros de esta estructura serán utilizados por muchas clases y por el propio Asesor Experto.

¿cuál es el problema de referirse a una única variable creada?

 

¿Y referirse a ellos por NOMBRE DE LA ESTRUCTURA.NOMBRE DEL MIEMBRO?

Pero, ¿hay alguna garantía de que esta variable no perderá su valor actual en tiempo de ejecución?

 
hoz:

Y referirse a ellos por NOMBRE DE LA ESTRUCTURA.NOMBRE DEL MIEMBRO ?

nombre de la variable.nombre del miembro.


Pero, ¿hay alguna garantía de que esta variable no pierda su valor actual durante la ejecución del programa?

Por ejemplo, ¿el cuartel general?

¿tiene ejecución multihilo en EA?

¿qué quiere decir que se perderá? lo que se pone en él, ¿por qué se va a perder?

 
в чем проблема обращаться к единственной созданной переменной?

Todo el mundo tiene derecho a vivir en el mundo de sus propias ilusiones,

pero destruir el mundo del usuariohoz esinusualmente difícil

porque no puedes meterte en su cabeza y averiguar lo que está imaginando.

"no perderá su valor actual" - ¿Crees que las variables se crean para perder sus valores?

Que en realidad:

Las variables tienenun ámbito, una duración de almacenamiento y una vinculación.

Aprende qué es: qué variable tiene qué ámbito, cuándo es visible, cuándo se crea, cuándo se destruye y dónde y cuándo se le puede pasar.

Brevemente sobre la vida útil del almacenamiento:
estática (variable declarada fuera de todas las funciones o con especificador estático) - hora de la muerte = fin de la existencia del programa

automática (una variable declarada dentro de una función) - momento de la muerte = salida de la función donde se crea

dinámico (variable creada con la palabra clave new) - momento de la muerte = uso de la palabra clave delete

 
sergeev:

¿tiene multithreading en el EA?

¿Qué quieres decir con que se perderá? lo que pongas ahí estará ahí, ¿por qué se va a perder?


Abre la documentación aquí y ve eso:

//+------------------------------------------------------------------+
//| Класс "Анализатор текстов"                                       |
//+------------------------------------------------------------------+
class СParser
  {
public:
   static int        s_words;
   static int        s_symbols;
   //--- конструктор и деструктор
                     Parser(void);
                    ~Parser(void){};
  };
...
//--- инициализация статических членов класса Parser на глобальном уровне
int CParser::s_words=0;
int CParser::s_symbols=0;

Si las variables de clase o estructura no pierden sus valores durante la ejecución del programa, ¿por qué se declaran aquí como estáticas?

Están en la sección pública, se puede decir que como en la estructura...

 
hoz:

Abre la documentación aquí y ve eso:

Si las variables de clase o estructura no pierden sus valores en tiempo de ejecución, ¿por qué se declaran aquí como estáticas?

Están en la sección pública, se puede decir que como en la estructura...


Entonces... Lee la segunda frase del enlace que te han dado.

Un static en una clase tiene un significado ligeramente diferente al de un static en una función.

 
hoz:

Si las variables de clase o estructura no pierden sus valores en tiempo de ejecución, ¿por qué se declaran estáticas aquí?

Están en la sección pública, se podría decir como en la estructura...


Eres un obtuso o una obtusa, perdona que sea tan brusco, pero está escrito en blanco y negro:

Porejemplo, tenemos una claseCParser destinada a analizar textos, ynecesitamos contarel número total de palabras y caracteres procesados. Bastacon declarar losmiembros necesariosde la clase como estáticos e inicializarlos globalmente, para que todas las instancias de la claseutilicen contadores comunes de palabras y caracteres al trabajar.

Dondequiera que haya una referencia a:

Las variables de clase o estructura pierden sus valores en tiempo de ejecución

Dice que preservando los principios de la POO y no creando variables globales, podemos contar el número de algunas palabras con la ayuda de un miembro estático de la clase,

(miembro estático de la clase) se crea como una única instancia y no depende de cuántos objetos de una clase determinada se creen.

Razón de la queja: