0

String クラスがあり、+ をオーバーロードして 2 つの String* ポインターを追加したいと考えています。このようなものは機能しません:

String* operator+(String* s1, String* s2);

参照渡しを回避する方法はありますか。次の例を検討してください。

String* s1 = new String("Hello");
String* s2 = new String("World");

String* s3 = s1 + s2;

私は仕事にこの種の追加が必要です。提案してください。

4

4 に答える 4

8

できません。組み込み型の演算子をオーバーロードすることはできません。いずれにしても、なぜポインターを使用するのでしょうか? 動的割り当てはできるだけ避けてください。

String s1("Hello");
String s2("World");

String s3 = s1 + s2;

それははるかに優れており、漏れません。これでオーバーロードできます:

String operator+(const String& s1, const String& s2);

あなたが望む方法。もちろん、これは時間の無駄ですstd::string。:)

于 2010-06-14T05:37:23.417 に答える
2

String クラスがあり、+ をオーバーロードして 2 つの String* ポインターを追加したいと考えています。

なんで?

このようなものは機能しません:

文字列* operator+(文字列* s1, 文字列* s2);

これは C++ のコア機能です。そのように変更することはできません。

参照渡しを回避する方法はありますか。

参照、ポインター、または値で渡すことができます。

渡しは非効率的です (正当な理由なく一時的に作成およびコピーされるため*)

この場合、ポインターによる使用は使用できません (ポインターの追加はコア言語機能です)。実際、(オーバーロードされた演算子に) ポインターを引数として渡す効率と、値を渡す便利な構文を組み合わせるために、参照が言語に追加されました。つまり、参照は、特定の状況を念頭に置いて作成された言語機能です。それらは最適なソリューションです。

参考までに、通常は受け入れられている解決策です。あなたの状況でこれが良くない理由を教えてください。

次の例を検討してください。

String* s1 = new String("こんにちは"); String* s2 = new String("World");

文字列* s3 = s1 + s2;

これは、C++ 構文に変換された Java または C# コードのように見えます。そうしないでください。このメンタリティは「私はどの言語でも C をプログラムできる」と呼ばれ、通常、C++ に移植しようとしているメンタリティに固有の問題と、C++ の固有の問題を組み合わせます。どちらの利点もありません。

私はあなたがそれをしていると言っているのではなく、あなたがまだそれをしていないことを確認するために言っているだけです:)。

私は仕事にこの種の追加が必要です。提案してください。

文字列を保持するための追加のスマート ポインター クラスを定義できます。多くのことをする必要はありません (それだけでstruct ptr { String* _value; /* add your syntax sugar and operators here */ }十分です。とはいえ、ポインタを追加するためだけにこれを行うのはまだ悪い考えです。

于 2010-06-14T09:14:03.970 に答える
2

ポインターだけでオーバーロードすることはできません。少なくとも 1 つのクラス タイプまたは列挙値が必要です。標準的な方法は、2 つの値をオーバーロードすることです。

String operator+(String s1, String s2);
于 2010-06-14T05:37:00.923 に答える
1

すでにこれを理解しているかどうかはわかりませんが、 2 つの文字列ではなく2 つのポインターを追加String* s3 = s2 + s1;しているため、ここでセマンティクスを変更する方法はありません。

独自の String クラスを持つことは大歓迎ですが、それが本当に必要なものであることを確認してください。最も一般的なケースでは、std::string で十分です。

そして、あなたがそれに取り組んでいる間は、もちろん、標準からの同様のクラスの公開された API に正当な理由がない限り、あまり逸脱しないようにしてください。おそらく、1 つの文字列と 1 つの文字列* を使用して operator+ を実行できますが、本当にそうしたいですか? 人々があなたのコードを維持する必要があり、STL/Boost のバックグラウンドを持っている場合、物事が特定の方法で機能することが期待されます。これにより、デバッグがはるかに簡単になります。

アルパン

于 2010-06-14T06:48:49.163 に答える