- 締切済み
const 回りのエラー?
以下のプログラムをcygiwn 上でコンパイルすると エラーが出るのですが 何がいけないのかよくわかりません。 メッセージを読んでconst 回りなのかな?とは思っているのですが… よろしくお願いします。 #include<iostream> #include<cstring> #include<cstdlib> using namespace std; class sample{ char *s; public: sample(); sample(const sample &ob); ~sample(){if(s) delete [] s; cout << "Freeing s\n";} void show(){cout << s << "\n";} void set(char *str); sample operator=(sample &ob); }; sample::sample() { s = new char('\0'); if(!s){ cout << "Allocation error\n"; exit(1); } } sample::sample(const sample &ob) { s = new char[strlen(ob.s)+1]; if(!s){ cout << "Allocation error\n"; exit(1); } strcpy(s,ob.s); } void sample::set(char *str) { s = new char[strlen(str)+1]; if(!s){ cout << "Allocation error\n"; exit(1); } strcpy(s,str); } sample sample::operator=(sample &ob) { if(strlen(ob.s)>strlen(s)){ delete [] s; s = new char[strlen(ob.s)+1]; if(!s){ cout << "Allocation error\n"; exit(1); } } strcpy(s,ob.s); return *this; } sample input() { char instr[80]; sample str; cout << "Enter a string: "; cin >> instr; str.set(instr); return str; } int main() { sample ob; ob = input(); ob.show(); return 0; } <コンパイル結果> In function 'int main()': 78:error:no match for 'operator=' in 'ob = input()()' 49:note:candidates are: sample sample::operator=(sample&)
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- Tacosan
- ベストアンサー率23% (3656/15482)
単に「だめだった」というのではなく, どのようなエラーメッセージが出たのかも書くようにしてください. 手元では (Cygwin じゃないけど g++ で) #1 の修正で (つまり引数を const sample & にするだけで) 問題なくコンパイルできましたよ. 定義するところを修正し忘れているとかいうオチはないだろうなぁ.... あと, ついでにいうと sample::set でリークしますね.
- ICE_FALCON
- ベストアンサー率56% (63/111)
ob = input(); 一時オブジェクトの参照渡しをやってますね。 sample ob; sample oa=input(); ob = oa; ならコンパイルできるのでは?(未確認)
- Tacosan
- ベストアンサー率23% (3656/15482)
代入演算子のオーバーロードを sample operator=(const sample &ob); にすればいいはず. もっとも, 普通は sample &operator=(const sample &ob); でしょうが. ついでにいうとデフォルトコンストラクタもなんかおかしい. あとで ::operator delete[] を使うので, s = new char[1]; *s = 0; のように ::operator new[] を使うのが本手だと思う.
お礼
回答ありがとうございます。 ご指摘通りオーバーロードを記述してみたのですが だめでした。 別の方の回答で一応の解決は見たので デフォルトコンストラクタの部分は ゆっくり見て考えさせていただきたいと思います。 ありがとうございました。
お礼
コンパイル通りました! ありがとうございます。 あとはご指摘いただいた内容を理解できるように ゆっくり読んでいきたいと思います(笑)