Perguntas OOP (Object Oriented Programming) - página 3

 
tara:

Acrescente.

Eu acrescentei ))
 
EverAlex:

Para um círculo, ele é calculado de uma forma, para um quadrado de outra. Mas em ambos os casos - chamando Figura.GetSquare(),

Eu, por exemplo, acho difícil aprender a teoria, demonstrar um exemplo e descrever como a função define um círculo, quadrado, trapézio ou triângulo ???
 
E silêncio ...
 
VOLDEMAR:
E silêncio ...

Bem, foi um 2x2=?

Não estou interessado em responder.

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

Talvez isto esteja mais próximo.

Há um conjunto padrão de métodos virtuais em uma classe: Open(), Close(), Read(), Write() etc.

Essa classe pode lidar com arquivos, mapeamento, canais, internet, etc.

Somente o conteúdo (descrição) desses métodos será diferente. Mas a interface de classe será idêntica.

 

Você não acha que é suspeito que já é a terceira página sobre o assunto e ninguém citou um único ponto de código como exemplo?

Além disso, não é interessante responder, é elementar, é tão simples que é preguiçoso demais para codificar...

Se alguém soubesse de alguma coisa, acho que teria respondido...

 

VOLDEMAR, se você assume seu primeiro posto, por que há uma classe lá? As aulas de redação são uma consequência da complexidade do programa, quando os elementos individuais têm muitos links externos, então é criada uma classe para unir todos esses elementos e criar uma interface simples. Na minha opinião, um atributo necessário de uma classe são os dados (int's, double's ...) - material com o qual as funções funcionam, a classe conecta tudo em um pacote (dados e funções). Por exemplo, dois exemplos, primeiro sem o OOP, segundo com ele:

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

No segundo exemplo, não temos que nos preocupar com dados que funcionarão, acho que este é o objetivo principal do OOP.

 
Por que o segundo método vomita um monte de erros e avisos ???
 

Mais uma observação sobre seu código:

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

Eu tenho uma regra: nunca escreva um destrutor vazio. A ausência de um destruidor é um indicador de simplicidade de classe. Se um destrutor for escrito, você pode ter que escrever um construtor de cópias e o = operador ou proibi-los. Exemplo:

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

Isto fará com que a exclusão seja chamada duas vezes para o mesmo ponteiro. A maneira correta é esta

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

Então, se você tem que escrever um destruidor, é uma boa razão para pensar duas vezes - o que fazer com ópera = e copiador construtor? Apagá-lo, escrevê-lo...? Não acho que você deva escrever o destruidor vazio, sua ausência é um indicador de que você não precisa refazer o acima exposto.

 
VOLDEMAR:
Por que o segundo método lança um monte de erros e avisos ???

Coloque um ponto depois disto, em vez de ->. mql chip.
 

Por favor, explique as ações

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

a saber

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

por que o sinal (:) e o que ganhamos com ele?

Razão: