你能帮我解决这个运行时错误吗?当我编译并运行它时,它会说“你的项目停止工作”。
这是该计划。我有2个带参数的构造函数,1个析构函数,1个复制构造函数,operator=
,opertator>>
和operator<<
重载,以及访问器函数(get和set)。我必须提到,对于这个项目,我创建了5个类,其他4个类除了这个类...
#include <iostream>
using namespace std;
class Badge
{
private:
char *badgeType;
char *badgeName;
char user[50];
public:
Badge(char *type, char* name, char *user)
{
this->badgeType = new char[strlen(type) + 1];
strcpy(this->badgeType, type);
this->badgeName = new char[strlen(name) + 1];
strcpy(this->badgeName, name);
strcpy(user, user);
}
Badge(char *name, char *user)
{
this->badgeType = NULL;
this->badgeName = new char[strlen(name) + 1];
strcpy(this->badgeName, name);
strcpy(user, user);
}
Badge(const Badge &source)
{
if (source.badgeName == NULL)
this->badgeName = NULL;
else
{
this->badgeName = new char[strlen(source.badgeName) + 1];
strcpy(this->badgeName, source.badgeName);
}
if (source.badgeType == NULL)
this->badgeType = NULL;
else
{
this->badgeType = new char[strlen(source.badgeType) + 1];
strcpy(this->badgeType, source.badgeType);
}
strcpy(user, source.user);
}
~Badge()
{
if (this->badgeName)
delete[] this->badgeName;
if (this->badgeType)
delete[] this->badgeType;
}
Badge operator=(const Badge &source)
{
if (this->badgeName)
delete[] this->badgeName;
if (source.badgeName == NULL)
this->badgeName = NULL;
else
{
this->badgeName = new char[strlen(source.badgeName) + 1];
strcpy(this->badgeName, source.badgeName);
}
if (this->badgeType)
delete[] this->badgeType;
if (source.badgeType == NULL)
this->badgeType = NULL;
else
{
this->badgeType = new char[strlen(source.badgeType) + 1];
strcpy(this->badgeType, source.badgeType);
}
strcpy(user, source.user);
return *this;
}
char *getBadgeName()
{
return badgeName;
}
void setBadgeName(char *newBadgeName)
{
if (strlen(newBadgeName) == 0)
cout << "Please enter a valid name.";
else
{
delete[] badgeName;
badgeName = new char[strlen(newBadgeName) + 1];
strcpy(badgeName, newBadgeName);
}
}
char *getBadgeType()
{
return badgeType;
}
void setBadgeType(char *newBadgeType)
{
if (strlen(newBadgeType) == 0)
cout << "Please enter a valid type.";
else
{
delete[] badgeType;
badgeType = new char[strlen(newBadgeType) + 1];
strcpy(badgeType, newBadgeType);
}
}
char *getUser()
{
return user;
}
void setUser(char *newUser)
{
if (strlen(newUser) == 0)
cout << "Please enter a valid user.";
else
strcpy(user, newUser);
}
void readBadge()
{
cout << "Badge name: "<< endl;
cin >> badgeName;
cout << "Badge type: " << endl;
cin >> badgeType;
cout << "User who owns the badge: " << endl;
cin >> user;
}
void writeBadge()
{
cout << "Badge name: " << badgeName << endl;
cout << "Badge type: " << badgeType << endl;
cout << "user who owns the badge: " << user << endl;
}
friend ostream& operator<<(ostream& consola, Badge &b);
friend istream& operator>>(istream& consola, Badge &b);
};
ostream& operator<<(ostream& consola, Badge &b)
{
consola << "Badge type: " << b.getBadgeType();
consola << "Badge name: " << b.getBadgeName();
consola << "User who owns the badge: " << b.getUser();
return consola;
}
istream& operator>>(istream& consola, Badge &b)
{
cout << "Badge name: ";
char buffer[30];
consola >> buffer;
b.setBadgeName(buffer);
cout << "Badge type: ";
char buffer1[20];
consola >> buffer1[20];
b.setBadgeType(buffer1);
cout << "User who owns the badge: ";
char buffer2[20];
consola >> buffer2;
b.setUser(buffer2);
return consola;
}
int main()
{
Badge b1("Type1", "Name1", "User101");
cout << endl << b1;
return 0;
}
答案 0 :(得分:1)
构造函数中存在问题:strcpy(user,user)
的目标和源名称相同。实际上,您将参数内容复制到自身并将user
数组保留在未初始化的对象中。这是此构造函数中唯一需要this->
:
Badge(char *type, char* name, char *user)
{
badgeType = new char[strlen(type) + 1];
strcpy(badgeType, type);
badgeName = new char[strlen(name) + 1];
strcpy(badgeName, name);
strcpy(this->user, user);
}
编辑: 正如Slava在评论中提到的那样,如果你传递的指针或参考参数不是要改变的,你应该将它们声明为{{1} }:这会在编译时发现这种微妙的不匹配
const
编辑2: 我无法建议您使用Badge(const char *type, const char* name, const char *user)
代替string
和char*
允许:然后您不再需要担心内存分配和char[]
。您可以依赖默认的复制构造函数,赋值运算符和析构函数。