Un elenco corretto non dovrebbe richiedere l'implementazione esplicita di una nuova classe per usarlo per una classe arbitraria...
Ho capito bene che anche se i nodi (elementi della lista) hanno un tipo diverso e un modo diverso di connessione tra loro, la lista dovrebbe comunque avere la stessa implementazione, cioè fare riferimento allo stesso tipo di dati? Condizionatamente CList dovrebbe includere diversi tipi di nodi (CSingleNode, CDoubleNode, ecc.)...
denkir: Condizionalmente, CList dovrebbe includere diversi tipi di nodi....
Perché? ) Un contenitore è un insieme di oggetti omogenei.
La differenza degli oggetti stessi può essere realizzata tramite il polimorfismo all'interno di oggetti già esistenti e non ha nulla a che fare con l'elenco.
Все объекты в MQL5 по умолчанию передаются по ссылке, но есть возможность использовать и указатели объектов. При этом есть опасность получить в качестве параметра функции указатель неинициализированного объекта. В этом случае работа программы будет завершена критически с последующей выгрузкой. Автоматически создаваемые объекты как правило такой ошибки не вызывают, и в этом отношении они достаточно безопасны. В этой статье мы попробуем разобраться в чем разница между ссылкой и указателей, когда оправдано использование указателей и как написать безопасный код с использованием указателей.
Perché? ) Un contenitore è un insieme di oggetti omogenei.
La differenza degli oggetti stessi può essere realizzata dal polimorfismo all'interno di oggetti già esistenti e non ha nulla a che fare con la lista.
È chiaro che una lista concreta comprende nodi omogenei. Intendevo dire che le relazioni tra i nodi di quella lista possono essere diverse, il che richiede un tipo di lista diverso per ogni tipo di nodo. Se si potesse creare la stessa classe di lista per nodi di tipo diverso, sarebbe fantastico.... Personalmente non l'ho ancora provato..... Bisogna pensare a un livello di astrazione più alto.....
Un foglio corretto non dovrebbe richiedere l'implementazione esplicita di una nuova classe per poterla utilizzare per una classe arbitraria.
Pertanto, l'implementazione corretta dovrebbe affidarsi ai template.
Ad essere onesti, non sono sicuro che questo sia realizzabile al livello di template presentato.
Ma questo è in realtà molto lontano dai problemi dell'articolo.
Come odio ammettere, l'esperto ha ragione. Idealmente, la classe leaf dovrebbe essere implementata su template. Anche se la CList standard è implementata su CObject.
Se ho capito bene la sua idea, tutti i metodi di una lista astratta dovrebbero riconoscere automaticamente il "suo" nodo (questo è polimorfismo).
Nell'articolo, ad esempio, ci sono le classi utente CiSingleList (Fig.9), CDoubleList (Fig.11), CiUnrollDoubleList (Fig.12), CiCircleDoubleList (Fig.13).
Quindi, in linea di principio, tutti questi metodi possono essere inseriti in una classe. Ma dovremo codificare ogni metodo in modo che riconosca il tipo di nodo di cui si occupa in un determinato momento. E questo richiederà anche una risorsa... quindi non tutto è così chiaro....
Все объекты в MQL5 по умолчанию передаются по ссылке, но есть возможность использовать и указатели объектов. При этом есть опасность получить в качестве параметра функции указатель неинициализированного объекта. В этом случае работа программы будет завершена критически с последующей выгрузкой. Автоматически создаваемые объекты как правило такой ошибки не вызывают, и в этом отношении они достаточно безопасны. В этой статье мы попробуем разобраться в чем разница между ссылкой и указателей, когда оправдано использование указателей и как написать безопасный код с использованием указателей.
denkir: È chiaro che un particolare elenco comprende nodi omogenei. Intendevo dire che le relazioni tra i nodi di quell'elenco possono essere diverse, il che richiede un tipo di elenco diverso per ogni tipo di nodo. Se si potesse creare la stessa classe di lista per nodi di tipo diverso, sarebbe fantastico.... Personalmente non l'ho ancora provato..... Bisogna pensare al livello superiore di astrazione.....
È necessario un solo tipo di nodo. Vedere l'implementazione del CObject standard e l'implementazione delle collezioni CArray, CList, CTree: MQL5 Reference --> Standard Library --> Classes for Data Organisation.
Se ho capito bene la sua idea, tutti i metodi di una lista astratta dovrebbero riconoscere automaticamente il "suo" nodo (questo è polimorfismo).
Nell'articolo, ad esempio, ci sono le classi utente CiSingleList (Fig.9), CDoubleList (Fig.11), CiUnrollDoubleList (Fig.12), CiCircleDoubleList (Fig.13).
Quindi, in linea di principio, tutti questi metodi possono essere inseriti in una classe. Ma dovremo codificare ogni metodo in modo che riconosca il tipo di nodo di cui si occupa in un determinato momento. E questo richiederà anche una risorsa... quindi non tutto è così chiaro...
Cosa c'è da codificare?
#include <Object.mqh>
#include <Arrays\ArrayObj.mqh>
enum ENUM_CLASS_TYPE
{
HUMAN,
ANIMAL,
CAR
};
class Community : public CObject
{
public:
ENUM_CLASS_TYPE TypeCommunity(){return type;}
protected:
Community(ENUM_CLASS_TYPE cType)
{
type = cType;
}
private:
ENUM_CLASS_TYPE type;
};
class Human : public Community
{
public:
Human() : Community(HUMAN){;}
int IQ(){return90;}
};
class Animal : public Community
{
public:
Animal() : Community(ANIMAL){;}
int CountLegs(){return4;}
};
class Car : public Community
{
public:
Car() : Community(CAR){;}
int Speed(){return20;}
};
voidOnStart()
{
CArrayObj elements;
CObject* object = NULL;
while(elements.Total() < 100)
{
switch(rand()%3)
{
case HUMAN:
object = new Human();
break;
caseANIMAL:
object = new Animal();
break;
caseCAR:
object = new Car();
break;
}
elements.Add(object);
}
while(elements.Total() > 0)
{
Community* AnyObject = elements.At(0);
switch(AnyObject.TypeCommunity())
{
case HUMAN:
{
Human* human = AnyObject;
printf("Element is Human, it's IQ is: " + (string)human.IQ());
break;
}
case ANIMAL:
{
Animal* animal = AnyObject;
printf("Element is anima, it has " + (string)animal.CountLegs() + " legs.");
break;
}
case CAR:
{
Car* car = AnyObject;
printf("Element is car. It has speed " + (string)car.Speed() + " km/h");
break;
}
}
elements.Delete(0);
}
}
Prima elementare, seconda media. Purtroppo non si può fare a meno di un intermediario comunitario, perché MQL5 ha un controllo dei tipi estremamente debole. Ma se avessimo a disposizione una funzione ClassToString come EnumToString(), tutto potrebbe essere organizzato in modo molto più elegante e semplice.
Signori, perché non proviamo a fare una discussione concreta? :)
Un foglio corretto non dovrebbe richiedere l'implementazione esplicita di una nuova classe per usarla per una classe arbitraria.
Pertanto, l'implementazione corretta dovrebbe fare affidamento sui template.
Ad essere onesti, non sono sicuro che questo sia realizzabile al livello di template presentato.
Ma questo è in realtà molto lontano dai problemi dell'articolo.
Un elenco corretto non dovrebbe richiedere l'implementazione esplicita di una nuova classe per usarlo per una classe arbitraria...
Condizionalmente, CList dovrebbe includere diversi tipi di nodi....
Perché? ) Un contenitore è un insieme di oggetti omogenei.
La differenza degli oggetti stessi può essere realizzata tramite il polimorfismo all'interno di oggetti già esistenti e non ha nulla a che fare con l'elenco.
Perché? ) Un contenitore è un insieme di oggetti omogenei.
La differenza degli oggetti stessi può essere realizzata dal polimorfismo all'interno di oggetti già esistenti e non ha nulla a che fare con la lista.
Un foglio corretto non dovrebbe richiedere l'implementazione esplicita di una nuova classe per poterla utilizzare per una classe arbitraria.
Pertanto, l'implementazione corretta dovrebbe affidarsi ai template.
Ad essere onesti, non sono sicuro che questo sia realizzabile al livello di template presentato.
Ma questo è in realtà molto lontano dai problemi dell'articolo.
Quello che propone TheXpert sembra essere chiaro.
Se ho capito bene la sua idea, tutti i metodi di una lista astratta dovrebbero riconoscere automaticamente il "suo" nodo (questo è polimorfismo).
Nell'articolo, ad esempio, ci sono le classi utente CiSingleList (Fig.9), CDoubleList (Fig.11), CiUnrollDoubleList (Fig.12), CiCircleDoubleList (Fig.13).
Quindi, in linea di principio, tutti questi metodi possono essere inseriti in una classe. Ma dovremo codificare ogni metodo in modo che riconosca il tipo di nodo di cui si occupa in un determinato momento. E questo richiederà anche una risorsa... quindi non tutto è così chiaro....
È chiaro che un particolare elenco comprende nodi omogenei. Intendevo dire che le relazioni tra i nodi di quell'elenco possono essere diverse, il che richiede un tipo di elenco diverso per ogni tipo di nodo. Se si potesse creare la stessa classe di lista per nodi di tipo diverso, sarebbe fantastico.... Personalmente non l'ho ancora provato..... Bisogna pensare al livello superiore di astrazione.....
Quello che propone TheXpert sembra essere chiaro.
Se ho capito bene la sua idea, tutti i metodi di una lista astratta dovrebbero riconoscere automaticamente il "suo" nodo (questo è polimorfismo).
Nell'articolo, ad esempio, ci sono le classi utente CiSingleList (Fig.9), CDoubleList (Fig.11), CiUnrollDoubleList (Fig.12), CiCircleDoubleList (Fig.13).
Quindi, in linea di principio, tutti questi metodi possono essere inseriti in una classe. Ma dovremo codificare ogni metodo in modo che riconosca il tipo di nodo di cui si occupa in un determinato momento. E questo richiederà anche una risorsa... quindi non tutto è così chiaro...
Cosa c'è da codificare?
Prima elementare, seconda media. Purtroppo non si può fare a meno di un intermediario comunitario, perché MQL5 ha un controllo dei tipi estremamente debole. Ma se avessimo a disposizione una funzione ClassToString come EnumToString(), tutto potrebbe essere organizzato in modo molto più elegante e semplice.