Domande su OOP (programmazione orientata agli oggetti) - pagina 8

 
C-4:
Typeid() purtroppo non esiste, e la forza dei template è nell'identificazione statica. Compiti diversi sono risolti con metodi diversi e dire che un metodo è cattivo e l'altro è buono è una supposizione aggravante.

Ho avuto un caso in cui era necessaria un'identificazione dinamica. Tutte le soluzioni erano molto ingombranti, tranne il tipo universale. Fatto attraverso una classe che implementa un tipo universale.

Ma anch'io mi sono messo nei guai. Qualcosa è cambiato in STL (stringa) da VS 2012 e da allora non compila. Non ho ancora risolto il problema.

 
Pavlick:

Huh, non puntatori, ma risate su un bastone.


La pagina al secondo link del mio post dice:

In MQL4 si possono creare dinamicamente oggetti di tipo complesso. Questo viene fatto usando l 'operatore new, che restituisce il descrittore dell'oggetto creato.

Il descrittore ha una dimensione di 8 byte. Sintatticamente, i descrittori di oggetti in MQL4 sono simili ai puntatori in C++.

Esempi:

MyObject* hobject= new MyObject();

Di nuovo, a differenza del C++, la variabile hobject dell'esempio precedente non è un puntatore alla memoria, ma un descrittore di oggetto.


 
EverAlex:

La pagina al secondo link del mio post dice:

In MQL4 è possibile creare dinamicamente oggetti di tipo complesso. Questo viene fatto usando l 'operatore new, che restituisce un descrittore dell'oggetto creato.

Il descrittore ha una dimensione di 8 byte. Sintatticamente, i descrittori di oggetti in MQL4 sono simili ai puntatori in C++.

Esempi:

MyObject* hobject= new MyObject();

Di nuovo, a differenza del C++, la variabile hobject dell'esempio precedente non è un puntatore alla memoria, ma un descrittore di oggetto.

Il compagno mql5 ha chiarito la situazione qui https://www.mql5.com/ru/forum/150943/page6#950107 . Stavo inconsapevolmente esagerando.
 

Ho chiesto al supporto tecnico non prima di ieri di separare il file di implementazione della classe dal file di interfaccia. E ho avuto una risposta:

В MQL нет файла проекта, фактически им выступает mq4 файл, а программа обязана иметь точки входа (при их отсутствии выдаётся ошибка "event handling function not found"). Поэтому при разделении интерфейса от реализации класса, файлом-реализации и интерфейса должны быть mqh файлы.

La linea di fondo è che essenzialmente non è un'opzione logica. Dopo tutto, il file con l'implementazione della classe è un file di implementazione, per proteggerlo dai client. E se entrambi sono in forma aperta, cioè nel formato .mqh, allora a cosa ci serve fare tutto questo?

 
hoz:

Ho chiesto al supporto tecnico non prima di ieri di separare il file di implementazione della classe dal file di interfaccia. E ho avuto una risposta:

La linea di fondo è che questa non è un'opzione logica. Dopo tutto, il file con l'implementazione della classe è un file di implementazione, per proteggerlo dai client. E se entrambi sono in forma aperta, cioè in formato .mqh, allora perché farlo?

Non separo mai la dichiarazione dall'implementazione. Scrivo tutto in un file di intestazione. Questo è molto più conveniente. Dovete tenere traccia di un file, non di due. Sono contento se ci sono solo tre metodi in una classe. Ma cosa succede se ce ne sono 100? Vi stancherete di confrontare i due file. Scriverai in uno e dimenticherai nell'altro...

C'è solo un caso in cui è necessario dividere i file. È quando due o più classi si riferiscono l'una all'altra. Tali soluzioni dovrebbero essere evitate. Questo è vero per C++. Non so come farlo in MQL.

 

Nel libro di testo, e in particolare qui ci sono i codici:

//+------------------------------------------------------------------+
//| Класс, реализующий элемент списка                                |
//+------------------------------------------------------------------+
class CItem
  {
   int               m_id;
   string            m_comment;
   CItem*            m_next;
public:
                     CItem() { m_id=0; m_comment=NULL; m_next=NULL; }
                    ~CItem() { Print("Destructor of ",m_id,
                                     (CheckPointer(GetPointer(this))==POINTER_DYNAMIC)?
                                     "dynamic":"non-dynamic"); }
   void              Initialize(int id,string comm) { m_id=id; m_comment=comm; }
   void              PrintMe() { Print(__FUNCTION__,":",m_id,m_comment); }
   int               Identifier() { return(m_id); }
   CItem*            Next() {return(m_next); }
   void              Next(CItem *item) { m_next=item; }
  };
//+------------------------------------------------------------------+
//| Простейший класс списка                                          |
//+------------------------------------------------------------------+
class CMyList
  {
   CItem*            m_items;
public:
                     CMyList() { m_items=NULL; }
                    ~CMyList() { Destroy(); }
    bool             InsertToBegin(CItem* item);
    void             Destroy();
  };

Sono disponibili i seguenti campi:

void              Next(CItem *item) { m_next=item; }

 bool             InsertToBegin(CItem* item);
Perché l' * in un caso è a destra e nell'altro a sinistra?
 
hoz:

Nel libro di testo, e in particolare qui ci sono i codici:

Ci sono campi come questo:

Perché il segno * in un caso è a destra e nell'altro a sinistra?

C'è scritto così. Non importa.

Io stesso scrivo l'operatore "*" per indicare un puntatore accanto a un tipo alla sua destra (int*) e quando dereferenzia una variabile alla sua sinistra (*pnVal).

 
Zhunko:

Questo è quello che c'è scritto. Non importa.

Io stesso scrivo l'operatore "*" per indicare un puntatore accanto a un tipo alla sua destra (int*) e, quando si dereferenzia, accanto a una variabile alla sua sinistra (*pnVal).

Lo immaginavo. Forse un programmatore disattento ha scritto l'esempio.

Ci sono altre cose strane:

 CItem*            m_next;

Significa che alla classe CItem è assegnato un descrittore di oggetto m_next?

 
hoz:

Nel libro di testo, e in particolare qui ci sono i codici:

Sono disponibili i seguenti campi:

Perché l' * in un caso è a destra e nell'altro a sinistra?

Non è a sinistra o a destra, è nel mezzo.
 
hoz:

Questo è quello che ho pensato. Immagino che un programmatore disattento abbia scritto l'esempio.

Ci sono altre cose strane:

Significa che la classe CItem è assegnata con il descrittore di oggetto m_next?


Questo significa che un'istanza deve essere creata usando l'operatore new.