Erros, bugs, perguntas - página 2563

 
Andrey Barinov:

?

Tem um modificador estático no exemplo, se o remover, o compilador dará um aviso como deve

estática pode ser acedida a partir de qualquer parte do seu código com o operador de resolução de contexto... a partir de qualquer fragmento de código! (não me lembro do âmbito, não o verifiquei recentemente, mas muito provavelmente será global, como se fosse descrito no topo do código, ou seja, não importa onde o método/campo estático foi declarado)

 
Igor Makanu:

Um statik pode ser acedido a partir de qualquer parte do código, utilizando a declaração de resolução de contexto... a partir de qualquer parte do código! (não me lembro do âmbito, não o verifiquei recentemente, mas muito provavelmente será global, como se estivesse descrito no topo do código, ou seja, não importa onde o método/campo estático é declarado)

Há quanto tempo é que se tornou assim :)?

Todas as mesmas regras se aplicam à estática (privada, protegida, pública), apenas não requerem a criação de objectos.

Este é um erro óbvio.

 
Andrey Barinov:

Há quanto tempo é assim :)?

Não sei, posso dizer com certeza que há uns meses atrás@Ilyas admin estava a explicar o procedimento de inicialização da estática, e ele mencionou que os métodos e campos de estática são inicializados juntamente com variáveis globais no arranque do programa MQL... vá mais longe e procure nos seus posts

Andrey Barinov:

Todas as mesmas regras se aplicam à estática (privada, protegida, pública), apenas não requerem a criação de objectos.

Este é um erro óbvio.

Não estou pronto para discutir e não quero discutir, mas o texto de ajuda indica o comportamento dos métodos estáticos

o código MQL está a dar grandes passos em direcção ao comportamento dos programas C#, a situação é semelhante lá, assim como se o programador decidir utilizar o operador de resolução de contexto, significa que recusa conscientemente a ajuda do compilador para identificar violações da integridade dos dados na classe, existem formas clássicas de obter métodos e campos sem operador de resolução de contexto


UPD: Decidi reescrever pouco a pouco a minha biblioteca de MQL, estou horrorizado por notar que escrevo como vi nos populares códigos MQL nomes de métodos e campos que coincidem com nomes de palavras reservadas....imho este é também um passo para evitar ajuda do compilador quando "quebra" dependências.... mais ou menos ))))

 

Igor Makanu:

como se o programador decidir utilizar o operador de resolução de contexto, significa que recusa conscientemente a ajuda do compilador para detectar a violação da integridade dos dados na classe, existem formas clássicas de obter métodos e campos sem operador de resolução de contexto

Penso que fumou demasiado OOP. Dê um descanso e depois volte com a cabeça fria. A declaração de resolução de contexto define a visibilidade mas não tem qualquer efeito no acesso.

 
TheXpert:

Penso que já teve demasiada OOP, descanse e depois com uma nova cabeça. a declaração de resolução de contexto define visibilidade mas não tem qualquer efeito no acesso.

Bem, cabe-me a mim decidir o que fumar e quando descansar ))))

SZY: há sempre muitos truques em qualquer língua com acesso a conteúdos de memória. Li os passatempos nos comentários, há lutas regulares sobre python e c++, mais uma vez - há formas mais humanas de trabalhar com campos e métodos, se decidiu que é mais rápido, então não deve culpar o que obtém - em todos os compiladores pode sempre invadir onde não deve)))

 
Igor Makanu:

Não sei, posso dizer com certeza que há uns meses atrás@Ilyas admin estava a explicar o procedimento de inicialização estática e mencionou que os métodos estáticos e campos estáticos são inicializados juntamente com variáveis globais no arranque do programa MQL... vá mais longe e procure nos seus posts

não estou pronto para discutir e não quero discutir, mas o texto de ajuda representa o comportamento dos métodos estáticos

"privado - permite o acesso a variáveis e métodos de uma classe apenas a partir de métodos dessa classe. "

Onde é que a palavra "apenas" não é clara?

OnStart não é um método de classe A, de acordo com o exemplo.

 
Aliaksandr Hryshyn:

"privado - permite o acesso a variáveis e métodos de uma classe apenas a partir de métodos dessa classe. "

Onde é que a palavra "apenas" não é clara?

OnStart não é um método de classe A, de acordo com o exemplo.

Não estamos a falar do modificador privado, mas do modificador estático - fazer testes e ver como se comporta a estática no MQL

 
Igor Makanu:

Não sei, posso dizer com certeza que há uns meses atrás@Ilyas admin estava a explicar o procedimento de inicialização estática e mencionou que os métodos estáticos e campos estáticos são inicializados juntamente com variáveis globais no arranque do programa MQL... vá mais longe e procure nos seus posts

não estou pronto para contestar, mas o texto de ajuda indica o comportamento dos métodos estáticos

E imho, não creio que seja necessário confirmar com argumentos - a MQL está a avançar muito em direcção ao comportamento dos programas C#, tem uma situação semelhante, bem como se o programador decidir utilizar o operador de resolução de contexto, isso significa que ele declina conscientemente a ajuda do compilador para identificar violações da integridade dos dados na classe, existem formas clássicas de obter métodos e campos sem operador de resolução de contexto


UPD: Decidi reescrever pouco a pouco a minha biblioteca de MQL, estou horrorizado por reparar que estou a escrever como vi nos populares códigos MQL nomes de métodos e campos que coincidem com nomes de palavras reservadas....imho isto é também um passo para evitar ajuda do compilador quando "quebra" dependências.... mais ou menos ))))

https://pikabu.ru/story/nevozmozhno_tak_nevozmozhno_2129852
 

?

é uma situação estranha, tudo fora da classe tem estado a trabalhar há muito tempo com os staichiqs. e estou apenas a fazer um grande alarido sobre isso.... Só por diversão, reproduza você mesmo o código:

int print(int value)
{  Print(value,":",__FUNCTION__); 
 return(value);
}
class A
{
private:
   static int        a1;
protected:
   static int        a2;
public:
   static int        a3;

};
//+------------------------------------------------------------------+
static int A::a1 = print(1);
static int A::a2 = print(2);
static int A::a3 = print(3);

//+------------------------------------------------------------------+
void OnStart()
{}
//+------------------------------------------------------------------+

Vê uma instância de objecto? e existe em MQL ;)

SZZ: E existe ao nível da ajuda... qual é o seu problema comigo?

https://www.mql5.com/ru/docs/basis/oop/staticmembers

Não ser capaz de declarar estatisticamente os membros da classe resultaria na necessidade de declarar estes dados a nível do programa global. Isto cortaria a relação entre os dados e a sua classe, e é também inconsistente com o paradigma básico do OOP de combinar dados e métodos numa classe para lidar com eles. Um membro estático permite a existência de dados de classe que não são específicos de uma instância individual no âmbito da classe.