Domande su OOP in MQL5 - pagina 14

 
TheXpert:

è anche sotto la custodia dei moderatori

Chiunque abbia parlato di custodia... ma un personaggio con due eccentricità...

 
TheXpert:

anche sotto la tutela dei moderatori

Pensavo di aver cancellato il mio stesso post.
 
Vladimir Simakov:
Sembra che io abbia cancellato il mio stesso post.

Questo era il caso quando un oggetto viene creato in una funzione tramite new. Originariamente, abbiamo parlato di passare un puntatore a un oggetto esistente. E qui si può passare così:

void f(CObj * obj){}

 
Dmitry Fedoseev:

E se un puntatore deve essere passato a una funzione per creare un oggetto nella funzione, è così che funziona:

class CObj{
   public:
   int f(){
      return(33);
   }
};

CObj * obj;

void OnStart(){
  z(obj);
  delete(obj);
}

void z(CObj & o){
   o = new CObj();
}
Questo è tutto quello che volevate sapere sull'OOP, ma avevate paura di chiedere)))

Questo codice mi fa uscire il terminale. Nel migliore dei casi, causa un errore critico nel debug (per l'animazione clicca sull'immagine):


Strano che un tale costrutto venga saltato dal compilatore.

 
Ragazzi, smettetela di litigare tra di voi, soprattutto a parità di condizioni.
Dmitry ha dato il primo esempio con un errore, e cosa c'è di male?
Dim, sì, compila senza errori, ma quando si esegue lo script, si verifica un errore.

Vladimir l'ha corretto e ha aggiunto un puntatore, il codice ha funzionato correttamente.
Di cos'altro abbiamo bisogno? Ora dobbiamo scoprire chi è il più figo? ))))
Ragazzi, siate rispettosi l'uno dell'altro, e non fate ricorso a personalità e insulti con arroganza.

Esempio iniziale di Dimitri
class CObj{
   public:
   int f(){
      return(33);
   }
};

CObj * obj;


void OnStart(){
  z(obj);
  delete(obj);
}

void z(CObj & o){     //тут пропущен указатель
   o = new CObj();
}
Correzione di Vladimir.
void z(CObj* &o){    //добавлен указатель
   o = new CObj();
}
La mia correzione con una stampa del risultato del metodo, per verificare
Questo esempio ora funziona, di cos'altro avete bisogno?
Smettete di cercare di capire chi è più figo o meno, tutti hanno errori e refusi.
class CObj
{
   public:
   int f(){return(33);}
};

void z(CObj* &o)
{
   o = new CObj();
   Print(o.f());
}

CObj * obj;

//+------------------------------------------------------------------+
void OnStart()
{      
  z(obj);
  delete(obj);
}
Nel corso di queste discussioni, credo che abbiamo identificato un errore del compilatore.
Perché il compilatore salta la compilazione dell'esempio iniziale di Dmitri senza errori?
 
Vasiliy Sokolov:

Questo codice mi fa uscire il terminale. Nel migliore dei casi, causa un errore critico di debug:

È strano che un tale costrutto venga passato dal compilatore.

Qui tutto è valido per il compilatore.

Viene creato un puntatore a un oggetto nel segmento dati del programma e viene inizializzato 0x0 durante la compilazione.

I comandi necessari al processore sono creati nel segmento di codice.

In fase di esecuzione, i comandi sono sollevati sullo stack all'indirizzo della funzione z(...).

E lì spostare rdx [0x0]

E l'accesso a un indirizzo di memoria nullo è vietato. La dereferenziazione di un puntatore nullo è chiamata

 
Vladimir Simakov:
Qui tutto è valido per il compilatore.

Per quale compilatore?

 
Vasiliy Sokolov:

Questo codice mi fa uscire il terminale. Nel migliore dei casi, provoca un errore critico nel debug (per l'animazione clicca sull'immagine):


Strano che un tale costrutto venga saltato dal compilatore.

Il mio compila, funziona correttamente, ma mostra un messaggio di perdita di memoria (la cancellazione non funziona) al completamento.

 
Igor Makanu:

Gli insegnerai le cose cattive ora, sono le cose buone che devono essere affrontate )))

#define private protected

Non ti sei seduto con i codici fxsaber per niente. Mi sembra un capolavoro.

 

Mi scuso per la disinformazione, ho scritto prima che non si può chiamare il metodo Create() in una classe figlia.

Ora, ricontrollato, è possibile. Ma l'accesso al membro privato m_button non era disponibile. Cioè era impossibile controllare, per esempio, lo stato del pulsante: premuto/rilasciato.

Ora con il suggerimento di Igor è possibile.

#define private protected
#include <Controls\Button.mqh>

class CMyButton : public CButton
{ 
  public: 
              CMyButton(void){}; 
             ~CMyButton(void){}; 
             
        bool    isPrevState;        // состояние кнопки на предыд.тике, true - была нажата     
        void    setButton();        // создаем кнопку
}; 

void CMyButton::setButton(void)
{
  // метод Create() вызывается
   Create(0, "setBtn", 0, 50, 300, 150, 325);
   Text("setBtn");
   
   m_button.State();     // работает когда включаем #define private protected
}
Motivazione: