Fragen zu OOP (Objektorientierte Programmierung) - Seite 3

 
tara:

Hinzufügen.

Ich fügte hinzu ))
 
EverAlex:

Für einen Kreis wird sie auf eine Weise berechnet, für ein Quadrat auf eine andere. Aber in jedem Fall - durch den Aufruf von Figura.GetSquare(),

Ich finde es zum Beispiel schwierig, die Theorie zu lernen, ein Beispiel zu demonstrieren und zu beschreiben, wie die Funktion einen Kreis, ein Quadrat, ein Trapez oder ein Dreieck definiert.
 
Und Stille ...
 
VOLDEMAR:
Und Stille ...

Nun, es war ein 2x2=?

Kein Interesse an einer Antwort.

=================

Vielleicht ist das näher dran.

Es gibt einen Standardsatz von virtuellen Methoden in einer Klasse: Open(), Close(), Read(), Write() usw.

Eine solche Klasse kann Dateien, Mapping, Kanäle, Internet usw. verwalten.

Nur der Inhalt (Beschreibung) dieser Methoden unterscheidet sich. Die Klassenschnittstelle wird jedoch identisch sein.

 

Finden Sie es nicht verdächtig, dass dies bereits die 3. Seite zu diesem Thema ist und niemand einen einzigen Codepunkt als Beispiel genannt hat?

Außerdem ist es uninteressant zu antworten, es ist elementar, es ist so einfach, dass es zu faul ist, zu kodieren...

Wenn jemand etwas wüsste, hätte er wohl geantwortet...

 

VOLDEMAR, wenn Sie Ihren ersten Beitrag nehmen, warum gibt es dort überhaupt eine Klasse? Das Schreiben von Klassen ist eine Folge der Programmkomplexität, wenn einzelne Elemente viele externe Links haben, dann wird eine Klasse erstellt, um alle diese Elemente zu vereinen und eine einfache Schnittstelle zu schaffen. Meiner Meinung nach ist ein notwendiges Attribut einer Klasse Daten (int's, double's ...) - Material, mit dem Funktionen arbeiten, die Klasse verbindet alles in einem Paket (Daten und Funktionen).Ich denke, das ist die Grundidee von OOP. Zum Beispiel zwei Beispiele, das erste ohne OOP, das zweite mit OOP:

void sum(int &i1, int &i2, int val)
{
    i1 += val;
    i2 += val;
}
int get_number(int &i1, int &i2)
{
    return i1 + i2;
}
void main()  // главная функция программы
{
    int i1, i2;
    sum(i1, i2, 56);
    any_fn(get_number(i1, i2));   // какое-то действие с нашей суммой.
}
class QQ
{
    int i1;
    int i2;
public:
    void sum(int val)
    {
        this->i1 += val;
        this->i2 += val;
    }
    int get_number()
    {
        return this->i1 + this->i2;
    }
};

void main()  // главная функция программы
{
    QQ q;
    q.sum(56);
    any_fn(q.get_number());   // какое-то действие с нашей суммой.
}

Im zweiten Beispiel brauchen wir uns keine Gedanken über die Daten zu machen, mit denen die Funktionen arbeiten, und ich denke, das ist der Hauptzweck von OOP.

 
Warum wirft die zweite Methode eine Reihe von Fehlern und Warnungen aus?
 

Eine weitere Bemerkung zu Ihrem Code:

...
class vr_trade
  {
   ...
                    ~vr_trade(){}
  };
...

Ich habe eine Regel: Schreibe niemals einen Destruktor leer. Das Fehlen eines Destruktors ist ein Indikator für die Einfachheit der Klasse. Wenn ein Destruktor geschrieben wird, müssen Sie möglicherweise einen Kopierkonstruktor und den =-Operator schreiben oder sie verbieten. Beispiel:

struct S {};
class QQ
{
    S *p;
public:
    QQ() {this->p = new S;}
    ~QQ() {delete this->p;}
};
void main()
{
    QQ q;
    QQ q2 = q;
}

Dies führt dazu, dass delete zweimal für denselben Zeiger aufgerufen wird. Der richtige Weg ist der folgende

class QQ
{
    S *p;
public:
    QQ() {this->p = new S;}
    ~QQ() {delete this->p;}
    QQ(QQ &);            // Только объявляем, определения нигде нет.
    QQ &operator=(QQ &); // Только объявляем, определения нигде нет.
};

//или
class QQ
{
    S *p;
public:
    QQ() {this->p = new S;}
    ~QQ() {delete this->p;}
    QQ(QQ &q)               {this->p = new S(*q.p);}
    QQ &operator=(QQ &q)    {*this->p = *q.p;}
};

Wenn man also einen Destruktor schreiben muss, ist das ein guter Grund, zweimal nachzudenken - was macht man mit opera = und copy constructor? Löschen, schreiben...? Ich glaube nicht, dass Sie den Destruktor leer schreiben sollten, denn sein Fehlen ist ein Indikator dafür, dass Sie die obigen Schritte nicht erneut durchführen müssen.

 
VOLDEMAR:
Warum wirft die zweite Methode eine Reihe von Fehlern und Warnungen aus?

Setzen Sie einen Punkt anstelle von ->. mql chip.
 

Bitte erläutern Sie die Maßnahmen

struct complex
  {
   double            re; // действительная часть
   double            im; // мнимая часть
   //--- конструкторы
                     complex():re(0.0),im(0.0) {  }
                     complex(const double r):re(r),im(0.0) {  }
                     complex(const double r,const double i):re(r),im(i) {  }
                     complex(const complex &o):re(o.re),im(o.im) { }
   //--- арифметические операции
   complex           Add(const complex &l,const complex &r) const;  // сложение
   complex           Sub(const complex &l,const complex &r) const;  // вычитание
   complex           Mul(const complex &l,const complex &r) const;  // умножение
   complex           Div(const complex &l,const complex &r) const;  // деление
  };

nämlich

                     complex():re(0.0),im(0.0) {  }
                     complex(const double r):re(r),im(0.0) {  }
                     complex(const double r,const double i):re(r),im(i) {  }
                     complex(const complex &o):re(o.re),im(o.im) { }

warum das Zeichen (:) und was bekommen wir damit?