テンプレート・パラメータ = void* のコンパイラ・バグ - ページ 19

 
pavlick_:

自爆?- というのは新しいですね :)

そう、自爆するんだ。これが「スタック」オブジェクトとダイナミック・オブジェクトの違いであることはご存じだと思いますが、ダイナミック・オブジェクトは自分自身をいつ削除するか尋ねません。)
 
Ilya Malev:
そう、自爆だ。これが「スタック」オブジェクトとダイナミック・オブジェクトの違いであることはご存じだと思いますが、ダイナミック・オブジェクトは自分自身をいつ削除するか尋ねません。)

コピー/ムーブコンストラクタ/オペレータという言葉を聞いたことがあるのではないでしょうか?

obj o;
{
   obj q;
   o = q;
   o = move(q);  // С++ вариант, более эффективный
}
 
pavlick_:

コピー/ムーブコンストラクタ/オペレータという言葉を聞いたことがあるのではないでしょうか?

では、その決定的な瞬間を見計らって、手遅れでなければ、そのようにコピーするのですか?:笑

ただ単に、OOPが嫌いだからなのか、それとも他に理由があるのか?

 
Ilya Malev:

では、その決定的な瞬間を見計らって、手遅れでなければ、そのようにコピーするのですか?:笑

ただ単に、OOPが嫌いだからなのか、それとも他に理由があるのか?

もちろん、それ以外にはないでしょう。まともなプログラマは、ダイナミックオブジェクトもスタックで管理する必要がある(RAII技法)

{
   unique_ptr<Class> p(new Class);
   ...
   // ой, самоуничтожение :)
}
 
そして、地獄のような、そのためのラッパーをたくさん作るのです。なぜなら、ポリモーフィズムの ニッチはそれほど重要ではありませんが、私たちの松葉杖は、OOPを使用しない場合、全体のフィールドのアプリケーションを持っています:cry。
 
pavlick_:

もちろん、それ以外にはないでしょう。まともなプログラマであれば、ダイナミックオブジェクトもスタックオブジェクトで管理しなければならない(RAIIテクニック)。

ゴミ収集員のことですか?))) や,参照回数のカウントなど,最近実践していることがあります。

 
din.objectsをスタックで管理するということは、各オブジェクトに24バイトのメモリを追加で割り当てるということです(その分、オブジェクト自体への「スタックポインタ」+「参照」が「重く」なる)。それに、スピードという意味での時間コストも決して小さくはない。このようなことは、全体としてはむしろ悲しいことです。しかし、私たちもそこに大きな必要性を感じているわけではありません。恐怖は多くの目を持つ、と言われるように。宇宙ステーションのプログラミングをするのであれば、厳密な管理がなければできないことです。しかし、そのままでは、細かく設定されたクラスシステムによって、それがなくてもすべてがうまく機能します。
 

いや、屑コレクターの話じゃなくて、スマートポインタの話。 unique_ptr, shared_ptr (with reference counting), RAII は簡単にググれる。 一般に unique_ptr はメモリ的に余計なコストがかからないし (wrapper == pointer size) 、呼び出しも最適化され過ぎだが、μl では全てが悲しい、そうだ。しかし、ここでも必要ない(スマートポインター)。

 
pavlick_:

あるいは、テンプレートを使って、次のように書くこともできます。

https://www.mql5.com/ru/forum/295485/page18#comment_9971363

また、Buttonはポリモーフィズムやインターフェイスを一切使用せず、ディテールに依存しない。ポリモーフィズムにはニッチがありますが、それは彼らが言うよりずっと狭いものです。

このように単純化された例では、確かにテンプレートの方が便利そうです。実際、インスタンスは1つだけなので、テンプレートは必要ありません。

 
Alexey Navoykov:

この簡略化された例では、確かにテンプレートの利便性が向上しているように見えます。実際、インスタンスは1つだけなので、テンプレートは必要ありません。

ボタンランプvia g with virtuality。

struct SwitchableDevice {
    virtual void switchOn() = 0;
    virtual void switchOff() = 0;
};
struct Lamp : SwitchableDevice {
    void switchOn(){std::cout << "shine bright" << std::endl;}
    void switchOff(){std::cout << "i am not afraid of the dark" << std::endl;}
};
struct Button {
    SwitchableDevice& dev;
    bool state = false;
    Button(SwitchableDevice& d) : dev(d) {}
    void buttonPress(){
        if (state) { dev.switchOff(); }
        else       { dev.switchOn();  }
        state = !state;
    }
};
int main(){
    Lamp lamp;
    Button button(lamp);
    button.buttonPress();
    button.buttonPress();
}

陳腐化した例