問題タブ [non-member-functions]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++ でのスライスと演算子のオーバーロード
背景情報
私はしばらく Java でプログラミングをしてきましたが、C++ に切り替えたのはほんの数か月前です。以上で、いよいよ本題です!私は基本的なテキスト ベースのゲーム エンジンを開発していますが、最近、興味深い具体的でありそうもない問題に遭遇しました。以下のプログラムで小規模にテストしてみましたが、(実際のゲーム コードとは対照的に) 画面を詰まらせず、問題の複雑さを軽減するために、(実際のゲーム コードとは対照的に) 表示することにしました。以下にモデル化された問題は、私の実際のコードの問題を反映していますが、ふわふわした邪魔者はありません。
問題
本質的に、問題はポリモーフィズムの 1 つです。出力演算子「<<」をオーバーロードして、階層内の各オブジェクトに固有の表示関数として機能させたいと考えています。問題は、これらの階層メンバーを格納するリストからこの演算子を呼び出すと、ID が失われ、基本クラスの出力演算子が呼び出されることです。通常、オペレーターのオーバーロードを単純な表示メソッドに置き換え、表示メソッドを仮想としてマークし、幸せな一日に進むことでこれを解決します。コードを変更することは特に気にしませんが、今は単純に興味があります。私がここで行っていることになる階層内の演算子をオーバーロードする方法はありますか?
【例】コード
[例] コードの出力
[例]コードの望ましい出力
c++ - c++ は、演算子のオーバーロード関数内の 2 つのオブジェクトに新しい変数を作成、割り当て、比較します。
課題:
提供された Alien.h ファイルを使用して Alien クラスを実装します。このシナリオでは、エイリアンは身長、体重、性別で説明されます。2 つのエイリアンを比較するには、次の式を使用してエイリアンの statusPoints 値を決定します。ステータス ポイントは、データ メンバーとして保持するのではなく、必要に応じて計算する必要があります。これにより、重みなどの 1 つのデータ メンバーが変更され、ステータス ポイント変数が更新されない、いわゆる古いデータが回避されます。エイリアンを比較するときは、ステータスを使用する必要があります。エイリアンを比較するには、==、!=、>、<、>=、および <= 演算子をオーバーロードする必要があります。したがって、次のようなステートメントを使用できます。
明らかに、エイリアン 1 はエイリアン オブジェクトであり、エイリアン 2 も同様です。また、データ メンバー (身長、体重、性別) が初期化されていると想定されます。
提供される .h ファイルは次のとおりです。繰り返しますが、このファイルは提供されているため、変更できません。
ここに私の Alien.cpp ファイルがあります。
.h ファイルを変更できない場合、または statusPoints をメンバー関数にすることができない場合、main またはオーバーロードされたオペレーター内のどこに statusPoints 変数を作成すればよいですか? また...比較のためにstatusPoints変数をオブジェクトに割り当てるにはどうすればよいですか?
どんな助けでも大歓迎です。ありがとう。
c++ - C++ での乗算演算子のオーバーロード
LAPACK への C++ インターフェイスを作成しましたが、メモリの問題が発生したため、演算子のオーバーロードを再考する必要がありました。
現在、2 つの Matrix オブジェクトを取り、適切な次元で 3 番目のオブジェクトを割り当て、D(GE/SY)MM を使用してproduct (新しく割り当てられた行列の内部ストレージに格納) し、その新しい行列へのポインタを返します。IE
それから私は利用します
そして、これはうまく機能します。私が抱えている問題は、これを行うたびに新しい行列を割り当てなければならないことです。私ができるようにしたいのは、C
行列を一度割り当てて、 と の積A
を( )B
の内部ストレージに配置することです。演算子のオーバーロードで見つけたものから、これを行う良い方法が見つかりません。これを行うためにメンバー関数を使用できることは承知していますが(つまり)、可能であればそれを避けたいと思います(非CSEタイプの開発を容易にするためにこれをコーディングしています)。どんなアイデアでも大歓迎です。C
C->data_
C->mult(A,B)
c++ - 非フレンド、非メンバー関数はカプセル化を増加させますか?
非メンバー関数がカプセル化を改善する方法の記事で、Scott Meyers は、非メンバー関数の "発生" を防ぐ方法はないと主張しています。
構文の問題
この問題について私が議論した多くの人と同じように、メンバー関数よりも非フレンド非メンバー関数を優先するべきであるという私のアドバイスの構文上の意味について留保する可能性があります。カプセル化についての議論。たとえば、Wombat クラスが食事と睡眠の両方の機能をサポートしているとします。さらに、食べる機能はメンバー関数として実装する必要がありますが、睡眠機能はメンバーまたは非友人非メンバー関数として実装できるとします。上記の私のアドバイスに従えば、次のように宣言できます。
ああ、すべての均一性!しかし、この統一性は誤解を招きます。世界には、あなたの哲学が夢見るよりも多くの機能があるからです。
率直に言えば、非メンバー関数が発生します。ウォンバットの例を続けましょう。これらのフェッチする生き物をモデル化するソフトウェアを作成し、ウォンバットが頻繁に行う必要があることの 1 つは、正確に 30 分の睡眠であると想像してください。明らかに、コードに への呼び出しを
w.sleep(.5)
散らかすことはできますが、それを入力するには大量の .5 秒が必要であり、いずれにせよ、その魔法の値が変更されたらどうなるでしょうか? この問題に対処する方法はいくつかありますが、おそらく最も簡単なのは、実行したいことの詳細をカプセル化する関数を定義することです。あなたが Wombat の作成者ではないと仮定すると、関数は必ず非 memberでなければならず、そのように呼び出す必要があります。そして、あなたの恐ろしい構文の矛盾があります。ウォンバットに餌をやりたいときはメンバー関数呼び出しを行いますが、昼寝させたいときは非メンバー呼び出しを行います。
少し反省し、自分自身に正直であれば、すべてのクライアントが必要とするすべての機能を備えたクラスは存在しないため、使用するすべての重要なクラスと矛盾していると主張することを認めるでしょう。すべてのクライアントは、独自の便利な関数を少なくともいくつか追加します。これらの関数は常に非メンバーです。C++ プログラマーはこれに慣れており、何も考えていません。メンバー構文を使用する呼び出しもあれば、非メンバー構文を使用する呼び出しもあります。人々は、呼び出したい関数に適した構文を調べて、それらを呼び出します。人生は続く。これは特に、標準 C++ ライブラリの STL 部分で発生します。一部のアルゴリズムはメンバー関数 (例: size)、一部は非メンバー関数 (例: unique)、一部は両方 (例: find) です。誰もまばたきしない。あなたでさえありません。
太字/イタリック体の文で彼が言っていることに頭を悩ませることはできません。非メンバーとして実装する必要があるのはなぜですか? Wombat クラスから独自の MyWombat クラスを継承し、nap()
関数を MyWombat のメンバーにしないのはなぜですか?
私は C++ を使い始めたばかりですが、おそらく Java でそれを行う方法です。これは C++ で行く方法ではありませんか? そうでない場合は、なぜですか?
c++ - フリー関数としてクラス外のテンプレートに operator!= を実装する正しい方法
map.hpp
ファイルに内部クラスを含む次のテンプレートがあります。
私はmain.cpp
以下を呼び出しますが、これまでのところすべて正常に動作しています:
map.hpp
ただし、フレンド関数をファイルからmap.hxx
他の実装を含むファイルに移動したいと考えています。
Q: フリー関数を.hxx
ファイルに移動することは可能ですか? どのようにしますか?
Iterator クラスで関数をフレンドとして宣言するのにうんざりし、実装ファイルで次のことを行いました。
ただし、次のように失敗しました:
ありがとう!