Questions sur la POO (programmation orientée objet) - page 9

 
Integer:

Cela signifie que vous devez créer une instance en utilisant l'opérateur new.
Il y a une chose que je ne comprends pas. Quelles sont les raisons impérieuses d'utiliser le nouvel opérateur ? Vous ne pouvez pas le faire sans elle, n'est-ce pas ?
 
hoz:
Il y a une chose que je ne comprends pas. Quelles sont les bonnes raisons d'imposer l'utilisation du nouvel opérateur ? C'est bon sans ça ?


Elle est nécessaire si vous voulez créer des objets de manière dynamique. Si vous ne savez pas à l'avance combien d'objets et quels types d'objets seront nécessaires.

 
hoz:
Так я вот одного не пойму. Какие веские причины принуждают к использованию оператора new ? Без него типа никак?
Integer:
C'est nécessaire si vous devez créer des objets de façon dynamique. Si vous ne savez pas à l'avance combien d'objets et quels types d'objets sont nécessaires,
.

Vous pouvez utiliser des tableaux de classes dynamiques. Dans MQL, cela fonctionnera. En C++, l'initialisation des membres d'une classe peut poser des problèmes. C'est pourquoi il est préférable de mettre un pointeur intelligent dans le tableau. Ainsi, vous n'avez pas à vous occuper de l'initialisation des classes et du nettoyage de la mémoire.

 
mql5:
class cFather
 {
 public:
 int GetData() {return 3;}
 };
 //+------------------------------------------------------------------+
 //| |
 //+------------------------------------------------------------------+
 class cChild : public cFather
 {
 public:
 int GetData() {return 5;}
 };

 int f(cFather *p) {return p.GetData();}
 //+------------------------------------------------------------------+
 //| |
 //+------------------------------------------------------------------+
 int OnStart()
 {
 cChild obj,*ptr=GetPointer(obj);
 f(ptr); // вернет 3
 ((cFather *)ptr).GetData(); // вернет 3

 return 0;
 }

Comment cette construction est-elle "lue" ?

((cFather *)ptr).GetData();

Ah, en particulier :

(cFather *)ptr)
Je le regarde et je ne comprends pas l'essentiel de ce qui se passe...
 
hoz:

Comment cette construction est-elle "lue" ?

((cFather *)ptr).GetData();

ptr est converti en type (classe) cFather et saméthode (cFather) GetData() est appelée

quelque chose comme ça...

 
keekkenen:

ptr est converti en type (classe) cFather et saméthode (cFather) GetData() est appelée

quelque chose comme ça...

C'est un truc bizarre... Je le pensais approximativement, mais... c'est trop pour être coulé dans un type (classe). En programmation de toute façon, d'après ce que j'ai entendu, il n'est pas recommandé de faire un cast vers un type (classe). Mais il ne s'agit pas seulement d'une conversion de type standard, mais plutôt d'une conversion de classe.

Reprenons ce code une fois de plus :

class cFather
 {
 public:
 int GetData() {return 3;}
 };
 //+------------------------------------------------------------------+
 //| |
 //+------------------------------------------------------------------+
 class cChild : public cFather
 {
 public:
 int GetData() {return 5;}
 };

 int f(cFather *p) {return p.GetData();}
 //+------------------------------------------------------------------+
 //| |
 //+------------------------------------------------------------------+
 int OnStart()
 {
 cChild obj,*ptr=GetPointer(obj);
 f(ptr); // вернет 3
 ((cFather *)ptr).GetData(); // вернет 3

 return 0;
 }

Ici, dans les paramètres du prototype de la fonction f, nous pouvons clairement voir que la fonction f prend une méthode de la classe cFather dans les paramètres. De plus, nous voyons la situation suivante dans le code START :

 f(ptr); // вернет 3

Dans ce cas, la fonction f prend un pointeur vers la classe cChild, plutôt qu'une méthode de la classe cFather. Depuis cChild obj, *ptr = GetPointer( obj ) ;

Quelle est la logique derrière tout ça ?

 

mm... logique où ?

dans la méthode f(), je pense que la logique est que le paramètre entrant sera traité correctement pour cFather (ou ses descendants).

 
keekkenen:

mm... logique où ?

dans la méthode f(), je pense que la logique veut que le paramètre entrant soit correctement traité pour cFather (ou ses descendants).

I.e.

 int f(cFather *p) {return p.GetData();}

ici *p est un pointeur vers cFather?

En même temps, j'étudie le C++ et je suis un peu dérouté par un vocabulaire similaire. Les pointeurs ne sont pas les mêmes ici.

 
hoz:

I.e.

ici *p est un pointeur vers cFather?

En même temps, j'étudie le C++ et je suis un peu dérouté par un vocabulaire similaire. Mais les indications ne sont pas les mêmes.

cPère est un type de pointeur. La variable pointeur elle-même pointe vers une instance de la classe.
 

Cela fait deux semaines que je n'ai pas eu de question. J'ai décidé de le demander. Ce n'est pas trop compliqué, mais logiquement je me demande si c'est une option. Voici le code :

struct Name
  {
   string            first_name;                 // имя
   string            last_name;                  // фамилия
  };
class CPerson
  {
protected:
   Name              m_name;                     // имя
public:
   void              SetName(string n);
   string            GetName(){return(m_name.first_name+" "+m_name.last_name);}
private:
   string            GetFirstName(string full_name);
   string            GetLastName(string full_name);
  };
void CPerson::SetName(string n)
  {
   m_name.first_name=GetFirstName(n);
   m_name.last_name=GetLastName(n);
  }
string CPerson::GetFirstName(string full_name)
  {
   int pos=StringFind(full_name," ");
   if(pos>0) StringSetCharacter(full_name,pos,0);
   return(full_name);
  }
string CPerson::GetLastName(string full_name)
  {
   string ret_string;
   int pos=StringFind(full_name," ");
   if(pos>0) ret_string=StringSubstr(full_name,pos+1);
   else      ret_string=full_name;
   return(ret_string);
  }

Il n'y a que 2 fonctions publiques dans ce code :

public:
   void              SetName(string n);
   string            GetName(){return(m_name.first_name+" "+m_name.last_name);}

Et les 2 fonctions privées sont appelées directement par la fonction publique, ou plutôt la fonction publique, au moment du besoin. Ce qui est intéressant, c'est que la fonction void SetName(string n) a le paramètre n, mais les deux méthodes privées : string GetFirstName(string full_name) et string GetLastName(string full_name) pour une raison quelconque n'ont pas le même paramètre. Bien que si vous prenez ce même code (et non l'autre), les méthodes privées sont appelées par les méthodes publiques avec les mêmes paramètres et il n'y a pas d'autre moyen. Alors pourquoi devrais-je donner des noms différents aux paramètres ?

J'espère que la question est claire.