OOP(オブジェクト指向プログラミング)に関する質問 - ページ 3

 
tara:

追加する。

追加 しました ))
 
EverAlex:

円の場合はある方法で、四角の場合は別の方法で計算されます。しかし、 どちらの場合でも、 Figura.GetSquare()を呼び出すことで、そのようなことが可能になります

例えば、理論を学び、例を示し、その関数が円、正方形、台形、三角形をどのように定義するかを説明するのは難しいと感じています。
 
そして沈黙.
 
VOLDEMAR:
そして沈黙.

まあ、2x2=だったかな?

答える気がない。

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

こっちの方が近いかも。

クラスには、Open()、Close()、Read()、Write()などの標準的な仮想メソッドが用意されています。

このクラスは、ファイル、マッピング、チャンネル、インターネットなどを扱うことができる。

これらのメソッドは、内容(記述)だけが異なります。しかし、クラスのインターフェイスは同一になる。

 

もう3ページ目なのに誰もコードポイント一つも例として挙げていないのは怪しいと思いませんか?

それに、回答しても面白くないし、初歩的で、コーディングするのが億劫になるくらい...。

もし、誰かが何かを知っていたら、答えていたと思うのですが...。

 

VOLDEMARさん、最初の投稿を受けると、なぜそこにクラスが全くないのですか?クラスを書くということは、プログラムが複雑になった結果、個々の要素が多くの外部リンクを持っている場合、これらの要素をすべて統合し、シンプルなインターフェースを作るためにクラスを作成するのである。私の考えでは、クラスの必要な属性はデータ(int型、double型...)であり、関数が働く材料であり、クラスはすべてを一つのパッケージ(データと関数)でつなぐものである。例えば、2つの例、1つ目はOOPなし、2つ目は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());   // какое-то действие с нашей суммой.
}

2番目の例では、関数が扱うデータについて心配する必要がありません。これは、OOPの主な目的だと思います。

 
なぜ2番目の方法は、エラーや警告をたくさん出すのですか?
 

もうひとつ、あなたのコードについて。

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

私は、「デストラクタは絶対に空で書かない」というルールを持っています。デストラクタがないことは、クラスが単純であることの指標となる。デストラクタを書くと、コピーコンストラクタや=演算子を書かなければならなくなったり、禁止されたりすることがあります。例

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

このため、同じポインタに対して2回deleteが呼び出されることになります。正しい方法はこうです。

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

ですから、もしデストラクタを書かなければならないのであれば、それはよく考えるべき理由です。オペラ = とコピーコンストラクタをどうするか?削除する、書く...?デストラクタを空で書く必要はないと思います。その不在は、上記をやり直す必要がないことを示す指標です。

 
VOLDEMAR:
なぜ2番目のメソッドはエラーと警告を大量に投げるのですか?

この後に -> の代わりにドットを入れる。 mqlチップ。
 

アクションについて教えてください。

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

即ち

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

なぜ記号(:)なのか、記号で何が得られるのか?