构建对象并输出对象时“您的项目停止工作”错误

时间:2016-11-21 19:10:38

标签: c++ class

你能帮我解决这个运行时错误吗?当我编译并运行它时,它会说“你的项目停止工作”

这是该计划。我有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;
}

1 个答案:

答案 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) 代替stringchar*允许:然后您不再需要担心内存分配和char[]。您可以依赖默认的复制构造函数,赋值运算符和析构函数。