趣味で C++ ( better C ) をやっています。
演算子のオーバーロードについて質問があります。
クラスのメンバとして演算子をオーバーロードすることは不可能なのでしょうか?
一応可能ですが、なぜかうまくいかないことがあります。
例えば 関数オブジェクト ( ファンクタ? ) として扱えるように、
operator() をオーバーロードして
C++
1 2class CTest{ 3 public: 4 CTest(int id) : mId(id){} 5 ~CTest(){} 6 7 std::string operator()( const std::string str ){ 8 // 処理。ただ単に別のメンバ関数を呼び出すだけとか? 9 } 10 protected: 11 ... // メンバ関数があるとする 12 private: 13 ... // メンバ変数やメンバオブジェクトがあるとする 14};
のようにやるとします。
クラス定義やメンバ関数定義まではうまくいきます。( operator() も可能。 )
C++
1CTest test( 100 ); 2cout << test("hello") << endl;
のようにするとうまくいくのですが、
C++
1CTest* test = new CTest( 100 ); 2cout << test("hello") << endl; 3delete test;
のようにするとエラーが...
意訳すると
'test' を関数として使うことは出来ない
というエラーが出ます。
どこのサイトだったか 忘れましたが、
「oprator[] を定義されているとき、オブジェクト test での test[1] は test.operator と等価である」
のような文章 ( 出てくる演算子や細かい言い回し等は違う可能性もありますが。 ) を読んだことがあるので、
C++
1CTest* test = new CTest( 100 ); 2cout << test.operator()("hello") << endl; 3delete test;
としてみました。
すると普通にコンパイルが通りました。
自分ひとりでやっているので別に「このクラスは必ずnewじゃない方法で生成しろ。それで関数オブジェクトとして使用しろ。」
と自分なりの定義 ( 命名規則とかそういう感じで。 ) でやればいいかもしれませんが、
できれば newで生成するかどうかに関係なく そのまま使える方がいいのですが...
それって不可能なのでしょうか?
それともやり方 ( 引数である const std::string str を empty ("") にするとか、引数をすべてポインタにするとか ) があるのでしょうか?
[情報]
言語 : C/C++
コンパイラ: MinGW
宜しくお願い致します。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。