Fragen zu OOP (Objektorientierte Programmierung) - Seite 9

 
Integer:

Das bedeutet, dass Sie eine Instanz mit dem Operator new erstellen müssen.
Es gibt eine Sache, die ich nicht verstehe. Was sind die zwingenden Gründe für die Nutzung des neuen Betreibers? Ohne sie geht es nicht, oder?
 
hoz:
Es gibt eine Sache, die ich nicht verstehe. Welche guten Gründe gibt es, die Verwendung des neuen Betreibers zu erzwingen? Geht es auch ohne?


Sie wird benötigt, wenn Sie Objekte dynamisch erstellen wollen. Wenn Sie nicht im Voraus wissen, wie viele Objekte und welche Arten von Objekten benötigt werden.

 
hoz:
Так я вот одного не пойму. Какие веские причины принуждают к использованию оператора new ? Без него типа никак?
Integer:
Wird benötigt, wenn Sie Objekte dynamisch erstellen müssen. Wenn Sie nicht im Voraus wissen, wie viele Objekte und welche Arten von Objekten benötigt werden.

Sie können dynamische Klassenarrays verwenden. Bei MQL funktioniert das. In C++ kann es zu Problemen bei der Initialisierung von Klassenmitgliedern kommen. Deshalb ist es besser, einen intelligenten Zeiger in das Array zu setzen. Sie müssen sich also nicht mit der Initialisierung der Klasse und dem Löschen des Speichers befassen.

 
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;
 }

Wie lässt sich diese Konstruktion "lesen"?

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

Ah, im Besonderen:

(cFather *)ptr)
Ich sehe es mir an, aber ich verstehe nicht, was los ist...
 
hoz:

Wie lässt sich diese Konstruktion "lesen"?

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

ptr wird in den Typ cFather(Klasse) umgewandelt und seine (cFather) Methode GetData() wird aufgerufen

etwa so...

 
keekkenen:

ptr wird in den Typ cFather(Klasse) umgewandelt und seine (cFather) Methode GetData() wird aufgerufen

etwa so...

Das ist eine seltsame Sache... Ich dachte, so ungefähr, aber... es ist zu viel, um auf einen Typ (Klasse) geworfen zu werden. In der Programmierung ist es, soweit ich gehört habe, ohnehin nicht empfehlenswert, auf einen Typ (Klasse) zu casten. Aber es handelt sich nicht nur um eine Standard-Typkonvertierung, sondern vielmehr um eine Klassenkonvertierung.

Nun, lassen Sie uns noch einmal zu diesem Code zurückkehren:

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;
 }

Hier in den Parametern des Prototyps der Funktion f ist deutlich zu sehen, dass die Funktion f eine Methode der Klasse cFather in den Parametern übernimmt. Außerdem sehen wir im START-Code die folgende Situation:

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

Hier nimmt die Funktion f einen Zeiger auf die Klasse cChild und nicht auf eine Methode der Klasse cFather. Da cChild obj, *ptr = GetPointer( obj );

Was ist die Logik dahinter?

 

Hm... Logik wo?

in der f()-Methode ist es meiner Meinung nach logisch, dass der eingehende Parameter für cFather (oder seine Nachkommen) korrekt verarbeitet wird

 
keekkenen:

Hm... Logik wo?

in der f()-Methode ist es meiner Meinung nach logisch, dass der eingehende Parameter für cFather (oder seine Nachfolger) korrekt behandelt wird

D.h.

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

hier ist *p ein Zeiger auf cFather?

Gleichzeitig lerne ich C++ und bin etwas verwirrt von ähnlichem Vokabular. Zeiger sind hier jedoch nicht dass elbe.

 
hoz:

D.h.

hier ist *p ein Zeiger auf cFather?

Gleichzeitig lerne ich C++ und bin etwas verwirrt von ähnlichem Vokabular. Die Hinweise hier sind jedoch nicht diesel ben.

cFather ist ein Zeigertyp. Die Zeigervariable selbst zeigt auf eine Instanz der Klasse.
 

Es ist schon ein paar Wochen her, dass ich eine Frage hatte. Ich beschloss, sie zu fragen. Es ist nicht allzu kompliziert, aber logischerweise frage ich mich, ob das eine Option ist. Hier ist der 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);
  }

In diesem Code gibt es nur 2 öffentliche Funktionen:

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

Und die beiden privaten Funktionen werden bei Bedarf direkt über die öffentliche Funktion aufgerufen, bzw. über die öffentliche Funktion. Interessant ist, dass die Funktion void SetName(string n) den Parameter n hat, aber die beiden privaten Methoden private: string GetFirstName(string full_name) und string GetLastName(string full_name) aus irgendeinem Grund nicht denselben Parameter haben. Nimmt man jedoch genau diesen Code (nicht den anderen), werden die privaten Methoden durch die öffentlichen mit denselben Parametern aufgerufen, und es gibt keinen anderen Weg. Warum sollte ich also den Parametern unterschiedliche Namen geben?

Ich hoffe, die Frage ist klar.

Grund der Beschwerde: