Errori, bug, domande - pagina 2563

 
Andrey Barinov:

?

Ha un modificatore statico nell'esempio, se lo rimuovi, il compilatore darà un avvertimento come dovrebbe

statico può essere raggiunto da qualsiasi parte del vostro codice con l'operatore di risoluzione del contesto... da qualsiasi frammento di codice! (non posso ricordare l'ambito, non l'ho controllato di recente, ma molto probabilmente sarà globale, come se fosse descritto all'inizio del codice, cioè non importa dove è stato dichiarato il metodo/campo statico)

 
Igor Makanu:

Si può accedere a uno statik da qualsiasi parte del codice usando la dichiarazione di risoluzione del contesto... da qualsiasi parte del codice! (non ricordo lo scopo, non l'ho controllato di recente, ma molto probabilmente sarà globale, come se fosse descritto all'inizio del codice, cioè non importa dove viene dichiarato il metodo/campo statico)

Quanto tempo fa è diventato così :)?

Tutte le stesse regole si applicano alle statiche (private, protected, public), solo che non richiedono la creazione di un oggetto.

Questo è un bug ovvio.

 
Andrey Barinov:

Da quanto tempo è così :)?

Non lo so, posso dire con certezza che un paio di mesi fa@Ilyas admin stava spiegando la procedura di inizializzazione della statica, e ha menzionato che i metodi e i campi della statica sono inizializzati insieme alle variabili globali all'avvio del programma MQL... vai oltre e cerca tra i suoi post

Andrey Barinov:

Tutte le stesse regole si applicano alle statiche (private, protected, public), solo che non richiedono la creazione di un oggetto.

Questo è un bug ovvio.

Non sono pronto a discutere e non voglio farlo, ma il testo di aiuto indica il comportamento dei metodi statici

il codice MQL sta facendo grandi passi verso il comportamento dei programmi C#, la situazione è simile lì, così come se il programmatore decide di usare l'operatore di risoluzione del contesto, significa che rifiuta consapevolmente l'aiuto del compilatore per identificare le violazioni dell'integrità dei dati nella classe, ci sono modi classici per ottenere metodi e campi senza operatore di risoluzione del contesto


UPD: ho deciso di riscrivere la mia libreria MQL a poco a poco, sono inorridito nel notare che sto scrivendo come ho visto nei codici MQL popolari nomi di metodi e campi che coincidono con nomi di parole riservate....imho questo è anche un passo per evitare l'aiuto del compilatore quando "rompe" le dipendenze.... così così ))))

 

Igor Makanu:

poiché se il programmatore decide di usare l'operatore di risoluzione del contesto, significa che rifiuta consapevolmente l'aiuto del compilatore per rilevare la violazione dell'integrità dei dati nella classe, ci sono modi classici per ottenere metodi e campi senza operatore di risoluzione del contesto

Penso che tu abbia fumato troppo OOP. Dagli un po' di riposo e poi fallo a mente lucida. La dichiarazione di risoluzione del contesto definisce la visibilità ma non ha effetto sull'accesso.

 
TheXpert:

Penso che tu abbia avuto troppa OOP, prenditi un po' di riposo e poi con una testa fresca. la dichiarazione di risoluzione del contesto definisce la visibilità ma non ha effetto sull'accesso.

Beh, sta a me decidere cosa fumare e quando riposare ))))

SZY: ci sono sempre un sacco di trucchi in qualsiasi linguaggio con accesso al contenuto della memoria. Ho letto gli hobby lì nei commenti, ci sono regolari lotte su python e c++, ancora una volta - ci sono modi più umani di lavorare con campi e metodi, se hai deciso che è più veloce, allora non dovresti biasimare quello che ottieni - in tutti i compilatori potresti sempre entrare dove non dovresti)))

 
Igor Makanu:

Non lo so, posso dire con certezza che un paio di mesi fa@Ilyas admin stava spiegando la procedura di inizializzazione statica e ha menzionato che i metodi statici e i campi statici sono inizializzati insieme alle variabili globali all'avvio del programma MQL... vai oltre e cerca nei suoi post

Non sono pronto a discutere e non voglio farlo, ma il testo di aiuto rappresenta il comportamento dei metodi statici

"privato - permette l'accesso alle variabili e ai metodi di una classe solo dai metodi di quella classe. "

Dove la parola "solo" non è chiara?

OnStart non è un metodo della classe A, secondo l'esempio.

 
Aliaksandr Hryshyn:

"privato - permette l'accesso alle variabili e ai metodi di una classe solo dai metodi di quella classe. "

Dove la parola "solo" non è chiara?

OnStart non è un metodo della classe A, secondo l'esempio.

Non stiamo parlando del modificatore privato, ma del modificatore statico - fate dei test e vedete come si comporta lo statico in MQL

 
Igor Makanu:

Non lo so, posso dire con certezza che un paio di mesi fa@Ilyas admin stava spiegando la procedura di inizializzazione statica e ha menzionato che i metodi statici e i campi statici sono inizializzati insieme alle variabili globali all'avvio del programma MQL... vai oltre e cerca nei suoi post

Non sono pronto a contestare, ma il testo della guida indica il comportamento dei metodi statici

E imho, non credo sia necessario confermare con argomenti - MQL si sta muovendo molto verso il comportamento dei programmi C#, ha una situazione simile, così come se il programmatore decide di usare l'operatore di risoluzione del contesto, significa che rifiuta consapevolmente l'aiuto del compilatore per identificare le violazioni dell'integrità dei dati nella classe, ci sono modi classici per ottenere metodi e campi senza operatore di risoluzione del contesto


UPD: ho deciso di riscrivere la mia libreria MQL a poco a poco, sono inorridito nel notare che sto scrivendo come ho visto nei codici MQL popolari nomi di metodi e campi che coincidono con nomi di parole riservate....imho questo è anche un passo per evitare l'aiuto del compilatore quando "rompe" le dipendenze.... così così ))))

https://pikabu.ru/story/nevozmozhno_tak_nevozmozhno_2129852
 

?

è una situazione strana, tutto al di fuori della classe ha funzionato per molto tempo con gli staichiq. e io sto solo facendo un gran casino per questo.... Solo per divertimento, riproducete voi stessi il codice:

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()
{}
//+------------------------------------------------------------------+

Vedete un'istanza dell'oggetto? ed esiste in MQL ;)

SZZ: Ed esiste a livello di aiuto... che problema hai con me?

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

Non potendo dichiarare staticamente i membri della classe, sarebbe necessario dichiarare questi dati a livello globale del programma. Questo troncherebbe la relazione tra i dati e la sua classe, ed è anche incoerente con il paradigma OOP di base di combinare dati e metodi in una classe per gestirli. Un membro statico permette ai dati di classe che non sono specifici di una singola istanza di esistere nell'ambito della classe.