基本上我到目前为止是一个代码,通过一个对象访问类方法,然后分配新的值,但它每次我尝试运行时都会崩溃,有人请告诉我我做错了什么
#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 [Build Error] [C:/Users/13276/Desktop/Untitled3.o]错误1
答案 0 :(得分:3)
所以看起来你把所有的setter声明为返回string
,但是你没有这样做。我猜你的意思是void
:
void setname(string input){name=input;}
为了完整起见,不返回值为undefined behavior。如果您更新所有setter以返回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]
答案 1 :(得分: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]
见here。您可以通过将返回类型更改为void来解决问题:
void setname(string input) { name = input; }
答案 2 :(得分:2)
您在return
中缺少setname()
声明。
尝试其中任何一种:
string setname(string input){return name=input;}
void setname(string input){name=input;}
您的其他setxxx
函数中存在类似的错误。