0

基本的に私がこれまでに持っているのは、オブジェクトを介してクラスメソッドにアクセスし、新しい値を割り当てるコードですが、実行しようとするたびにクラッシュし続けます誰かが間違っていることを教えてください

#include <iostream> 
#include <fstream>
#include <string> 
using namespace std; 
class person
{
      private:
              string name;
              string age;
              string country;
              string food;
              string sex;
              string drink;
      public:
             string setname(string input){name=input;}
             string setage(string input){age=input;}
             string setcountry(string input){country=input;}
             string setfood(string input){food=input;}
             string setsex(string input){sex=input;}
             string setdrink(string input){drink=input;}

             string showname(){return name;}
             string showage(){return age;}
             string showcountry(){return country;}
             string showfood(){return food;}
             string showsex(){return sex;}
             string showdrink(){return drink;}
};
int main() 
{ 
  //ofstream logwrite("test.txt"); 
  cout<<"Create Person? (y/n) ";
  string anwser;
  cin>>anwser;
  if (anwser=="y")
  {
  person object;
  cout<<"Name? ";
  string name;
  cin>>name;
  object.setname(name);
  cout<<object.showname();

  }
  //logwrite.close(); 
  return 0; 
}

申し訳ありませんが、これを書いたときは急いでいました。クラスが終了し、別のスペアがありませんでした。コンパイラとしてDev-C ++を使用しているので、警告などをサポートしているかどうかはわかりませんが、これらのエラーメッセージが表示されます。

C:\ Users \ 13276 \ Desktop\Untitled3.cppメンバー関数`std:: string person :: setname(std :: string)':

C:\ Users \ 13276 \ Desktop\Untitled3.cppメンバー関数`std:: string person :: setname(std :: string)':

F:\ Makefile.win[ビルドエラー][C:/Users/13276/Desktop/Untitled3.o]エラー1

4

3 に答える 3

3

したがって、すべてのセッターが戻ると宣言されているように見えますが、そうでstringはありません。私はあなたが意味したと推測していますvoid

void setname(string input){name=input;}

完全を期すために、値を返さないことは未定義の動作です。すべてのセッターを更新して返すvoidようにすると、問題が解決したように見えます。

コメントで述べたように、警告が判明した場合は、おそらくすぐに問題が発生したはずです。これらの線に沿った何か:

Compilation finished with warnings:
source.cpp: In member function 'std::string person::setname(std::string)':
source.cpp:15:54: warning: no return statement in function returning non-void [-Wreturn-type]
于 2013-03-07T17:20:31.543 に答える
2

存在しない文字列オブジェクトをクリーンアップしようとするため、プログラムがクラッシュしています。

setメソッドでは、値を返していません(メソッド宣言で値が返されるはずですが)。これは未定義の動作です。

string setname(string input){name=input;}

ただし、生成されたコードは文字列オブジェクトの割り当てを解除しよfreeうとし、スタックに残っているランダムなメモリアドレスを解放しようとするため、呼び出しは失敗します。

*** glibc detected *** ./prog: free(): invalid pointer: 0x08049110 ***
======= Backtrace: =========
/lib/i386-linux-gnu/i686/cmov/libc.so.6(+0x6e3f1)[0xb76103f1]
/lib/i386-linux-gnu/i686/cmov/libc.so.6(+0x6fc58)[0xb7611c58]
/lib/i386-linux-gnu/i686/cmov/libc.so.6(cfree+0x6d)[0xb7614d0d]
/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZdlPv+0x1f)[0xb77904bf]
/lib/i386-linux-gnu/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0xb75b8e46]
./prog[0x8048b21]

ここに見られるように。return typeをvoidに変更することで、問題を解決できます。

void setname(string input) { name = input; }
于 2013-03-07T17:19:37.543 に答える
2

returnにステートメントがありませんsetname()

代わりに、次のいずれかを試してください。

string setname(string input){return name=input;}

void setname(string input){name=input;}

他の関数にも同様のバグがありますsetxxx

于 2013-03-07T17:19:48.007 に答える