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

因此,看起来您已将所有 setter 声明为返回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

您的程序正在崩溃,因为它试图清理一个不存在的字符串对象。

在您的设置方法中,您没有返回一个值(即使您的方法声明说它应该是)。这是未定义的行为:

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]

如此处所见。您可以通过将返回类型更改为 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 回答