Domande su OOP (programmazione orientata agli oggetti) - pagina 3

 
tara:

Aggiungere.

Ho aggiunto ))
 
EverAlex:

Per un cerchio si calcola in un modo, per un quadrato in un altro. Ma in entrambi i casi - chiamando Figura.GetSquare(),

Io per esempio trovo difficile imparare la teoria, dimostrare un esempio e descrivere come la funzione definisce un cerchio, un quadrato, un trapezio o un triangolo?
 
E il silenzio...
 
VOLDEMAR:
E il silenzio...

Beh, era un 2x2=?

Non è interessato a rispondere.

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

Forse questo è più vicino.

C'è un insieme standard di metodi virtuali in una classe: Open(), Close(), Read(), Write() ecc.

Tale classe può gestire file, mappatura, canali, internet, ecc.

Solo il contenuto (descrizione) di questi metodi sarà diverso. Ma l'interfaccia della classe sarà identica.

 

Non ti sembra sospetto che sia già la terza pagina sull'argomento e nessuno ha citato un solo punto di codice come esempio?

Inoltre, non è interessante rispondere, è elementare, è così semplice che è troppo pigro per codificare...

Se qualcuno sapesse qualcosa, penso che avrebbe risposto...

 

VOLDEMAR, se prendi il tuo primo post, perché c'è proprio una classe? Scrivere classi è una conseguenza della complessità del programma, quando i singoli elementi hanno molti collegamenti esterni, allora si crea una classe per unire tutti questi elementi e creare una semplice interfaccia. Secondo me, un attributo necessario di una classe sono i dati (int, double...) - materiale con cui lavorano le funzioni, la classe collega tutto in un pacchetto (dati e funzioni). Per esempio, due esempi, il primo senza OOP, il secondo con esso:

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());   // какое-то действие с нашей суммой.
}

Nel secondo esempio, non dobbiamo preoccuparci dei dati con cui le funzioni lavoreranno, penso che questo sia lo scopo principale dell'OOP.

 
Perché il secondo metodo genera un mucchio di errori e avvertimenti?
 

Un altro commento sul tuo codice:

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

Ho una regola: mai scrivere un distruttore vuoto. L'assenza di un distruttore è un indicatore della semplicità della classe. Se viene scritto un distruttore, potreste dover scrivere un costruttore di copia e l'operatore = o vietarli. Esempio:

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

Questo farà sì che la cancellazione venga chiamata due volte per lo stesso puntatore. Il modo corretto è questo

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

Quindi, se dovete scrivere un distruttore, è una buona ragione per pensarci due volte - cosa fare con opera = e copia costruttore? Cancellarlo, scriverlo...? Non credo che dovresti scrivere destructor vuoto, la sua assenza è un indicatore che non hai bisogno di rifare quanto sopra.

 
VOLDEMAR:
Perché il secondo metodo lancia un mucchio di errori e avvertimenti?

Mettete un punto dopo questo invece di ->. mql chip.
 

Si prega di spiegare le azioni

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;  // деление
  };

cioè

                     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) { }

perché il segno (:) e cosa otteniamo con esso?

Motivazione: