0

序数スケールを表すクラスを作成していますが、論理的なゼロ ポイント (時間など) はありません。このスケールでは、加算と減算 ( operator+operator+=、...) は許可されますが、乗算は許可されません。

それでも、特定のグループ (この場合は数学演算子) の 1 つの演算子をオーバーロードするときは、そのグループに属する他のすべての演算子もオーバーロードすることをお勧めします。この場合、乗算演算子と除算演算子もオーバーロードする必要があることを意味します。これは、ユーザーが使用できる場合A+B、他の演算子を使用できる可能性が高いためです。

コンパイラ時にこれに対してエラーをスローするために使用できる方法はありますか? 最も簡単な方法は、演算子をオーバーロードしoperator*ないことですが、operator* is not know for class "time".

それとも、これは私が本当に気にするべきではないことですか ( RTFM ユーザー)?

4

5 に答える 5

8

実装されていないことを知らせるためだけに演算子を実装するのは不自然に思えます。privateどちらかといえば、それをメンバー関数として定義し、static_assert誰か (おそらく友人) が使用しようとした場合にコンパイラ エラーを表示する を配置することができます。

オペレーターが実装されていない場合の最善の解決策は、実装しないことです。

于 2012-06-07T20:41:23.727 に答える
4

それでも、特定のグループ (この場合は数学演算子) の 1 つの演算子をオーバーロードするときは、そのグループに属する他のすべての演算子もオーバーロードすることをお勧めします。

違う。唯一のグループは+and +=- そして多分 -andのようなもの-=です。一般に「算術演算子」はグループではありません。のようなものを検討してくださいstd::string

于 2012-06-07T20:44:02.870 に答える
2

短いバージョン: 足し算はあるが掛け算はない数学的構造があるので、心配する必要はありません。表現している数学的構造にとって意味のある演算子をオーバーロードします。誰かが乗算を 2 回試みた場合、そのエラーno match for operator* in ...は C++ プログラマーにとって理にかなっているはずです。なぜ 2 倍にならないのか、本当に当惑すると思われる場合は、ドキュメントを詳しく説明してください。特定のクラスに対して演算子が意味をなさない理由を知り、それをエラーメッセージで表現するのは、実際にはコンパイラの仕事ではないと思います。

長いバージョン: 大まかに言えば、「算術演算子」を持ち、群である集合の数学用語です+(-通常演算子+が可換でない限り、群演算子の記号を使用しないため、アーベル群)。掛け算を持ち、足し算を持たない集合も、集合から外せば群になることができます0。足し算と掛け算は構造的に似ています。重要な違いは、掛け算は通常、反転 ( 0) のない要素を少なくとも 1 つ受け入れるのに対し、足し算は通常受け入れないことです。

+は、自然数の加算、シーケンスの連結、さらには和集合などの記号として使用されることもあります。これらの要素には一般に逆数がありません。その場合、グループすらなく、バイナリ関数だけがあり、 unary-を定義せず、バイナリも定義しない可能性があります-。このような場合、間違いなく+演算子の選択は不適切ですが、保存するには遅すぎますstd::string

あなたのグループが+と も-持ち、と*の間の関係に関する特定の条件を満たしている場合それはring、または加法的恒等式を除くすべての要素が乗法逆数を持っている場合 (したがって行儀の良い を持っている場合) は体です。+*/

時間に関しては、絶対時間と継続時間という 2 つの異なる概念を考慮すると役立つことがよくあります。2 つの期間 (期間を指定する)、または絶対時間と期間 (絶対時間を指定する) を合計することはできますが、2 つの絶対時間を合計しても意味がありません (「先週の月曜日と次の木曜日」とは何ですか?)。

この動作が、ポインター (絶対時間の代わり) および整数 (期間の代わり) で定義された演算子に似ているのは、まったくの偶然ではありません。できますが(char*)0 + 0、できません(char*)0 + (char*)0。したがって、絶対時間には加法はありませんが、operator+(abstime, abstime)ある可能性がありoperator+(abstime, duration)ます。

期間は数字に似ていますが、物理的な次元があります。期間に無次元数 ( ) を掛けることは理にかなってい2.4 * 3s == 7.2sますが、2 つの期間を乗算することはめったにありません。単位が秒の 2 乗であるため、結果は期間ではありません。

于 2012-06-07T22:36:20.783 に答える
0

オーバーロードされた演算子を宣言するだけで、実装しないでください。コンパイル時にリンカが大騒ぎします。

于 2012-06-07T20:43:30.167 に答える
-1

編集:使用されている場合は呼び出されることを望んでいたことに気付きました。それなら、実装しないでおくか、実行時エラーに対して assert コマンドを使用するのが最善でしょう。

assert("Message");
于 2012-06-07T20:42:19.277 に答える