访问违规C ++ visual studio Classes

时间:2016-11-11 17:12:57

标签: c++ arrays visual-studio class access-violation

我得到一个:“在ConsoleApplication18.exe中0x00E8316C抛出异常:0xC0000005:访问冲突写入位置0xCDCDCDD1。”当我运行我的代码时,这就是全部,并且错误在我标记注释的地方中断。谢谢你的时间!

#include "iostream"
using namespace std;


class Transaction
{
public:
    int USERID;
    int Amount;
    virtual void Report()   //modify for each transaction type
    {

    }

    virtual void Perform()  //modify for each transaction type
    {

    }

};


class Transfer : public Transaction
{
public:
    int transID;   // id of the user to tranfer with
    int transType; // type of transition; to or fro

    void Perform()
    {
        cout << "\n" << "Transfer" << "\n\n";
        cout << "Enter the id of the user to tranfer with: ";
        cin >> transID;
        cout << "\n" << "Transfer type:" << "\n" << "1: To   2: Fro" << "\n";
        cin >> transType;
        if (transType == 2)
        {
            int temp = transID;
            transID = USERID;
            USERID = temp;
        }
        cout << "\n" << "Enter the amount you wish to withdraw: ";
        cin >> Amount;

    }

    void Report()
    {
        cout << "\n\n" << "Transfer of " << Amount << "$ from user: #" << USERID << " to the user: #" << transID;
    }

};


class Withdraw : public Transaction
{
public:

    void Perform()
    {
        cout << "\n" << "Withdraw" << "\n\n";
        cout << "Enter the amount you wish to withdraw: ";
        cin >> Amount;

    }
    void Report()
    {
        cout << "\n\n" << "Withdrawl of: " << Amount << "$";
    }

};

class Deposit : public Transaction
{
public:

    void Perform()
    {
        cout << "\n" << "Deposit" << "\n";
        cout << "Enter the amount you wish to deposit: ";
        cin >> Amount;
    }
    void Report()
    {
        cout << "\n\n" << "Deposit of: " << Amount << "$";
    }

};




class User
{
public:
    int ID;
    int numTrans;
    Transaction* t[100];
    int TYPE;

    User()
    {
        numTrans = 0;
    }

    void AddWithdraw()
    {
        t[numTrans] = new Withdraw;
        numTrans++;
    }

    void AddDeposit()
    {
        t[numTrans] = new Deposit;
        numTrans++;
    }

    void AddTransfer()
    {
        t[numTrans] = new Transfer;
        numTrans++;
    }

};


void main()
{
    User*u[100];
    int id;
    int type;
    int counter;

    counter = 0;

    for (int i = 0; i <= 100; i++)
    {
        u[i] = new User;
    }

    while (true)
    {
        type = 0;

        cout << "\nPlease enter your ID: ";
        cin >> id;

        cout << "\n" << "Which transaction would you like to perform" << "\n" << "1: Withdraw" << "\n" << "2: Deposit" << "\n" << "3: Transfer" << "\n";
        cin >> type;

        if (type != 1 && type != 2 && type != 3)
        {
            type = 1;
        }

        for (int i = 0; i <= counter; i++)
        {
            if (u[i]->ID == id || i == counter)
            {

                if (i == counter)// Add the type of transaction to the transaction array
                {
                    if (type == 1) { u[i]->AddWithdraw(); }
                    if (type == 2) { u[i]->AddDeposit(); }
                    if (type == 3) { u[i]->AddTransfer(); }

                }

                u[i]->t[u[i]->numTrans]->USERID = id; //BREAKS HERE
                u[i]->t[u[i]->numTrans]->Perform();

                for (int b = 0; b <= u[i]->numTrans; b++)
                {

                    u[i]->t[b]->Report();
                }
                break;
            }
        }

        // Report all of the previous transactions
        counter++;

    }



}

1 个答案:

答案 0 :(得分:1)

您的代码中存在很多错误。

  • Transaction缺少虚拟析构函数。

  • 填充阵列时,您没有进行任何边界检查。

  • 当您的循环需要使用<=时,他们正在使用<

  • 访问u[i]->t[]数组时,主循环超出范围。

  • 您没有为每个已分配的ID分配User字段,因此您无法按其ID找到用户。

  • 您正在泄漏记忆,因为您从未释放任何TransactionUser个对象。

尝试更像这样的东西:

#include <iostream>

using namespace std;

class Transaction
{
public:
    int USERID;
    int Amount;

    virtual Transaction() {}

    virtual void Report() = 0;
    virtual void Perform() = 0;
};

class Transfer : public Transaction
{
public:
    int transID;   // id of the user to tranfer with
    int transType; // type of transition; to or fro

    void Perform()
    {
        cout << "\n" << "Transfer" << "\n\n";
        cout << "Enter the id of the user to tranfer with: ";
        cin >> transID;
        cout << "\n" << "Transfer type:" << "\n" << "1: To   2: Fro" << "\n";
        cin >> transType;
        if (transType == 2)
        {
            int temp = transID;
            transID = USERID;
            USERID = temp;
        }
        cout << "\n" << "Enter the amount you wish to withdraw: ";
        cin >> Amount;    
    }

    void Report()
    {
        cout << "\n\n" << "Transfer of " << Amount << "$ from user: #" << USERID << " to the user: #" << transID;
    }    
};

class Withdraw : public Transaction
{
public:    
    void Perform()
    {
        cout << "\n" << "Withdraw" << "\n\n";
        cout << "Enter the amount you wish to withdraw: ";
        cin >> Amount;

    }

    void Report()
    {
        cout << "\n\n" << "Withdrawl of: " << Amount << "$";
    }    
};

class Deposit : public Transaction
{
public:    
    void Perform()
    {
        cout << "\n" << "Deposit" << "\n";
        cout << "Enter the amount you wish to deposit: ";
        cin >> Amount;
    }

    void Report()
    {
        cout << "\n\n" << "Deposit of: " << Amount << "$";
    }    
};

class User
{
public:
    int ID;
    int numTrans;
    Transaction* trans[100];
    int TYPE;

    User()
    {
        numTrans = 0;
    }

    ~User()
    {
        for (int i = 0; i < numTrans; ++i)
            delete trans[i];
    }

    Transaction* AddTransaction(int type)
    {
        if (numTrans == 100)
            return NULL;

        Transaction *t;

        switch (type)
        {
            case 1:
                t = new Withdraw;
                break;

            case 2:
                t = new Deposit;
                break;

            case 3:
                t = new Transfer;
                break;

            default:
                return NULL;
        }

        trans[numTrans] = t;
        numTrans++;

        return t;
    }

    Transaction* AddWithdraw()
    {
        return AddTransaction(1);
    }

    Transaction* AddDeposit()
    {
        return AddTransaction(2);
    }

    Transaction *AddTransfer()
    {
        return AddTransaction(3);
    }
};

void main()
{
    User* users[100];
    int numUsers = 0;
    int id;
    int type;

    for (int i = 0; i < 100; ++i)
    {
        users[i] = new User;
        users[i]->ID = i+1;
        ++numUsers;
    }

    while (true)
    {
        cout << "\nPlease enter your ID: ";
        cin >> id;

        User *user = NULL;
        for (int i = 0; i < numUsers; ++i)
        {
            if (users[i]->ID == id)
            {
                user = users[i];
                break;
            }
        }

        if (!user)
        {
            cout << "Invalid id!" << "\n";
            continue;
        }

        type = 0;

        do
        {
            cout << "\n" << "Which transaction would you like to perform" << "\n" << "1: Withdraw" << "\n" << "2: Deposit" << "\n" << "3: Transfer" << "\n" << "4: Quit" << "\n";
            cin >> type;

            if ((type >= 1) && (type <= 4))
                break;

            cout << "Invalid selection!" << "\n";
        }
        while (true);

        if (type == 4)
            break;

        // Add the type of transaction to the transaction array
        Transaction *trans = user->AddTransaction(type);
        if (!trans)
        {
            cout << "Too many transactions for this id!" << "\n";
            continue;
        }

        trans->USERID = id;
        trans->Perform();

        for (int b = 0; b < user->numTrans; ++b)
             user->trans[b]->Report();
    }

    for (int i = 0; i < numUsers; ++i)
        delete users[i];

    return 0;
}
相关问题