выполнить не удалось (выходное значение 1) c ++ - PullRequest
0 голосов
/ 24 января 2012

Я создаю программу для данных о сотрудниках, и по какой-то причине мой код не запускается, я искал этот форум и другие, и я не могу выяснить проблему с моим кодом.

#include <cstdlib>
#include <iomanip>
#include <iostream>

using namespace std;


class Employee{
    public:

        int idNumber;
        float SalaryRate;
        char * name;
        int BaseSalary;
        char * hisname;
        float salary;
        float bonus;
        float finalSalary;

        Employee(int idNum) //default constructor function
        {
            SalaryRate=0;
            BaseSalary=0;
            idNumber=idNum;
            BaseSalary=0;
            salary=0;
            bonus=0;        
        }
        //constructor function with parameters
        Employee(char * name, int SalaryRate, int idNumber)
        {

            SalaryRate=0;
            idNumber=0;
            strcpy(name, hisname) ;
        }

        float setBonus()
        {
            cout<<"What is the bonus for this employee?\n";
            cin>>bonus;

        }

        void increaseSalary (float increase)
        {
            cout<<"By what percentage would you like to increase ";
            cout<<"p";
            cout<<"'s salary? \n";
            cin>>increase;
            finalSalary = salary * (increase/100)+bonus;
        }


        void print ()
        {
            cout<<"the salary of ";
            cout<<* name;
            cout<< " is "; 
            cout<<finalSalary; 
        }
};


int main() {
    Employee * employees[100];

    for(int i = 0; i < 100; i++)
    {
        cout<<"What is the name you would like to input? ";
        cin>>employees[i]->name;
        int idNumber=i;
        cout<<"What is "; employees[i]->name; "'s hourly rate? ";
        cin>>employees[i]->SalaryRate;       
    }

    //Employee a();
    //a.increaseSalary();

    return 0;
}

Ответы [ 5 ]

2 голосов
/ 24 января 2012

Вы выделяете 100 указателей Сотруднику. Но они еще не построены.

Employee* employees[100];

for(int i = 0; i < 100; i++)
{
    Employee* emp = new Employee(i);
    cout<<"What is the name you would like to input? ";
    cin >> emp->name;
    int idNumber=i;
    cout << "What is "; emp->name; "'s hourly rate? ";
    cin >> emp->SalaryRate;

    employees[i] = emp;
}
1 голос
/ 24 января 2012

Я вижу пару проблем:

  • не распределяет сотрудников (как отмечено в других ответах)
  • ожидая cout<<"What is "; employees[i]->name; "'s hourly rate? "; напечатать, что вы хотите. Это на самом деле три отдельных заявления. Чтобы напечатать все три, используйте cout << "What is " << employees[i]->name << "'s hourly rate? ";
  • с использованием строк в стиле c вместо std::string
  • нарушение инкапсуляции путем обнародования членов Employee

Возможно, есть и другие проблемы, именно те, которые я нашел первым.

1 голос
/ 24 января 2012

Вы не инициализируете ни Employee * employees[100];, ни строки в сотрудниках.

Вероятно, вы хотите:

class Employee{
public: 
    int idNumber;
    float SalaryRate;
    std::string name; // <--- !
    int BaseSalary;
    std::string hisname; // <--- !
    float salary;
    float bonus;
    float finalSalary;  
...
};
int main() {
    Employee employees[100]; // <--- !

    for(int i = 0; i < 100; i++)
    {
        cout<<"What is the name you would like to input? ";
        cin>>employees[i].name;
        int idNumber=i;
        cout<<"What is "; employees[i].name; "'s hourly rate? ";
        cin>>employees[i].SalaryRate;
    }

    //Employee a();
    //a.increaseSalary();

    return 0;
}
1 голос
/ 24 января 2012

Массив указателей employees[i] не выделен ни одной памяти.
Вам необходимо выделить указатели с памятью, чтобы иметь возможность использовать их осмысленно.
Далее,
Вы пытаетесьзаписать данные в нераспределенный указатель, что приведет к неопределенному поведению .
Вам необходимо выделить достаточно памяти для указателя name, используя new для хранения введенной вами строки.

Кроме того, Вы должны соблюдать Правило трех для своего класса.

0 голосов
/ 24 января 2012

Очень быстро падает.

Это потому что это:

Employee * employees[100];

Объявляет массив из 100 указателей сотрудников. НЕ объекты.

Затем в цикле вы пытаетесь получить доступ к несуществующему объекту:

employees[i]->name

Поскольку доступ осуществляется через указатель, который не был инициализирован.
Вы должны понимать объекты, прежде чем начать играть с указателями и динамически размещенными объектами.

Employee     employees[100];   // Declare an array of 100 objects.

Тогда вы можете прочитать имена с помощью:

cin >> employees[i].name;

Но теперь у вас есть проблема с тем, что имя - это унифицированный указатель. Проблемы продолжаются вот так. Вы должны удалить указатели из своего кода и использовать объекты везде, где можете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...