OLP. Problemi di applicazione - pagina 7

 
equivalent23:

Naturalmente:

Ho capito che il problema è comeriempirecorrettamente l'array shapes[10] con istanze di classi derivate da CShape. L'opzione che ho suggerito non funziona per qualche motivo. Pensiamo.
 
Yedelkin:
Ho capito che il problema è come riempirecorrettamente l'array shapes[10] con istanze di classi derivate da CShape. La variante da me suggerita non funziona per qualche motivo. Pensiamo.

L'array deve essere di tipo puntatore di classe, non di tipo classe stesso.

Poi possiamo applicare un nuovo operatore.

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5
 
AlexSTAL:

L'array deve essere del tipo puntatori di classe, non della classe stessa.

Poi si può applicare il nuovo operatore.

Posso fare un esempio?

È solo che l'esempio che ho dato è stato preso dalla documentazione e non è chiaro come dovrebbe funzionare...

 
Yedelkin:
Ho capito che il problema è come riempirecorrettamente l'array shapes[10] con istanze di classi derivate da CShape. La variante da me suggerita non funziona per qualche motivo. Pensiamo.

Che lo pensiate o no, 100 rubli non sono soldi.

L'esempio è al 100% glitch, e una tale implementazione non è ben pensata o non è finita.

Non citerò i risultati dei miei esperimenti in codice, vi darò solo le conclusioni:

1. Se dichiarate gli oggetti non come classi ma come strutture, essi entreranno facilmente in un array. Ma la virialità dovrà essere rimossa, e potrete lavorare solo con la funzionalità del tipo di oggetti che ha l'array (in questo caso, una classe base);

2. 2. Puoi dichiararli come puntatori, e poi puoi formare un array:

a) se i puntatori non vengono cancellati, si verificano perdite di memoria;

b) non si può nemmeno lavorare normalmente con le funzionalità dei discendenti.

PS

Per essere più precisi - la funzionalità che è stata dichiarata nella classe base è disponibile e visibile anche nei discendenti, ma tutto ciò che è apparso nei discendenti è inaccessibile.

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов - Документация по MQL5
 
AlexSTAL:

Un array deve essere di tipo puntatore a classi, non di tipo della classe stessa.

Poi si può applicare il nuovo operatore.

Sì, ho anche pensato in questa direzione, sull'uso dei puntatori. Ma allora le condizioni della documentazione non sono soddisfatte:

"Per un quadrato (classe CSquare) l'area è calcolata attraverso i lati, per un cerchio (classe CCircle) l'area è espressa attraverso il raggio e così via. Possiamo creare un array per memorizzare oggetti di tipo CShape, in cui possiamo memorizzare sia l'oggetto di una classe base che tutti i suoi discendenti. In seguito possiamo chiamare la stessa funzione per qualsiasi elemento di questa matrice.

...Poiché abbiamo bisogno dei valori corrispondenti dei membri m_radius e m_square_side per calcolare l'area di un quadrato e di un cerchio, abbiamo aggiunto le funzioni SetRadius e SetSide() alla dichiarazione della classe corrispondente. Ora possiamo dichiarare un array di tipo Shape e riempirlo con oggetti di classi derivate..."

 
AlexSTAL:

Un array deve essere di tipo puntatore a classi, non di tipo della classe stessa.

Poi si può applicare il nuovo operatore.

Non funziona normalmente. Anche se formerà una matrice.

Yedelkin:

...Poiché il calcolo dell'area di un quadrato e di un cerchio richiede valori corrispondenti dei membri m_radius e m_square_side, abbiamo aggiunto le funzioni SetRadius e SetSide() nella dichiarazione della classe corrispondente. Ora possiamo dichiarare un array di tipo Shape e riempirlo con oggetti di classi derivate..."

Il fatto è che se l'array è di tipo classe base, non si può accedere alle funzionalità discendenti, cioè SetRadius() e SetSide() diventano non disponibili.

Per questo vedo tre opzioni:

1. la matrice deve essere omogenea (se possibile);

2. Non capisco qualcosa della filosofia OOP e dell'architettura di MQL5;

3. O gli sviluppatori non hanno implementato l'esempio, o non hanno seguito la domanda.

 
Interesting:
Non funzionerà correttamente. Tuttavia, formerà una matrice.
Cosa vuol dire che non funzionerà?
 
Interesting:

Per essere più precisi - la funzionalità che è stata dichiarata nella classe base è disponibile, e allo stesso tempo è visibile ai discendenti, ma tutto ciò che è apparso ai discendenti è inaccessibile.

Sì, è esattamente quello in cui mi sono imbattuto.

Interessante:

L'esempio è al 100% glitch...

Risulta che abbiamo bisogno di una risposta da parte degli autori del Manuale su questo argomento.

 
Interesting:
Non funzionerà correttamente. Tuttavia, formerà una matrice.

Il trucco è che se l'array è di tipo classe base, le funzionalità discendenti non sono accessibili, cioè SetRadius() e SetSide() non sono disponibili.

Per questo vedo tre opzioni:

1. la matrice deve essere omogenea (se possibile);

2. Non capisco qualcosa della filosofia OOP e dell'architettura di MQL5;

3. gli sviluppatori hanno tradito un esempio che non funziona, o non hanno completato il compito.

Eseguire:

class CBase
  {
public:
   void m_radius() {Print("CBase");}
  };

class CTest : public CBase
  {
public:
   void m_radius() {Print("CTest");}
  };

CBase* Base;

void OnStart()
  {
   Base = new CTest;
   Base.m_radius();
   ((CTest *)Base).m_radius();
   delete Base;
  }

potrebbe essere fatto in un modo molto più semplice... dalla virtualizzazione:

class CBase
  {
public:
   virtual void m_radius() {Print("CBase");}
  };

class CTest : public CBase
  {
public:
   virtual void m_radius() {Print("CTest");}
  };

CBase* Base;

void OnStart()
  {
   Base = new CTest;
   Base.m_radius();
   delete Base;
  }
 
AlexSTAL:
Cosa vuol dire che non funziona normalmente?

1. La funzionalità discendente non è disponibile. Non so chi o come, ma personalmente non ho mai avuto accesso a SetRadius() e SetSide() dall'Array.Forse c'è un modo per risolvere il problema con autogenous, ma voglio farne a meno.

2. Forse sto lavorando male con i puntatori, ma o ho una perdita per tutto il tempo o devo colpire i puntatori proprio nel blocco dove viene fatto il lavoro principale.