2012-03-08 10 views
0

私はポインタで返される不変の文字列クラスを持っています(nullにすることができます)。ポインタラッパーので、演算子をオーバーロードできますか?

オーバーロードしたいImmutableString* == const char*。しかし、左のパラメータがポインタであり、ポインタが非ポインタでなければならないので、私はできません。この関数はnullメンバーを比較処理しますが、私はそれをオーバーロードできません。

私は使用する可能性のあるポインタラッパーとは何ですか?私は使用したいかもしれないので、私は必要なオーバーロードを行うことができますか?好ましくは標準的なもの。私は自分自身を簡単に書くことができると思うが、私の腸は、ブーストまたはストールには1つがあるという。

+1

醜いデザインをスクラップし、ポインタから遠ざかりますか? –

+0

@CatPlusPlus:できません。私はCとvoid *コールバックを使用しています。私はそれらをいくつかの場所で参照することができますが、refはnullではありません –

+0

関数から 'ImmutableString *'を返すと、それを破壊する責任は誰にありますか? – fredoverflow

答えて

0

umm ...スマートポインタ? std::auto_ptrまたはstd::shared_ptr

しかし、なぜこのような2つのポインタを比較しますか?私には正しい方法が好きだと思われるのは、ImmutableString::operator == (const char*)を実装し、ポインタの代わりにオブジェクトを使うことです。

ImmutableString* is = foo(); 
(*is) == "whatever" 
+0

'std :: auto_ptr'は多くの意味上の問題のために廃止されました。それは 'shared_ptr'、' unique_ptr'、 'weak_ptr'に置き換えられました。これらがない場合は、std :: tr1またはtr1 :: namespacesを試してください。そうでない場合は、ブーストを使用してください。 –

+0

このアプローチの問題は、ベクトル上でfind()を使うと文字列が見つからず、文字列の等価性ではなくptrで比較される場合です。 –

+0

@ acidzombie24:...これは*必要なものです*。通常は "文字列へのポインタ"を実際に "文字列"として扱うべきではありません。そのような方法で 'find'を使うことができるようにハックを作ることは、どこにでも意味の悪夢を作る価値がありません。特に、ハックなしで 'find_if'を使うことができます。 (または可能であればポインタの代わりにベクトルに値を格納する) – Hurkyl

1

標準のラッパーはわかりませんが、最初から書き込むのは難しくありません。

class WrappedImmutableString { 
private: 
    ImmutableString *value; 
public: 
    WrappedImmutableString(ImmutableString *value): value(value); 
    char operator*() const { return value; } // dereference operator 
    bool operator==(const char *other) {...} 
    void delete() { delete value; } 
}; 

をしかし、あなたは「)(myImmutableString.delete」と「myImmutableStringを削除」交換する必要があると思いますのでご注意:非常にシンプルなものは次のようになります。

あなたがしようとしていることはおそらくです。悪い考えです。

+1

'delete'はキーワードです。デストラクタに何が問題なのですか? –

+0

@ R.MartinhoFernandesは何を言ったのですか?また、私はこのコードが非常に悪いことがわかりました。 Theresの言及はない - >と*これはテンプレート化されていません。 Theres no ==も==。削除は間違っていて、 'public:'を除いてここで行を再利用することはできませんでした。 +0。これはコメントだったはずです。また、悪い考えではありません。 std :: stringsは==によって比較することができます。これは本質的に私が望むものですが、自分の軽量クラスを使用しています。 –

+0

私はラッパーを必要としないことにまともなオッズを置くでしょう - 'ImmutableString'はこの目的に適しています(または簡単に修正されています)。そして、ポインターではなく返す関数を返すことができます。それら。 – Hurkyl

関連する問題