首页 > 解决方案 > 尝试将对象添加到向量并显示结果,但出现段错误但无法正常工作

问题描述

我正在尝试将在堆上添加的对象添加到我的向量中,但我似乎无法让它们添加、计算和显示结果。显示结果时出现段错误。我希望将对象添加到向量中,然后我想计算工资并显示结果。我做错了什么导致段错误?

主文件

#include <cstdlib>
#include <vector>
#include "Employee.h"

using namespace std;


int main(int argc, char** argv) {
    vector<Employee *> myVector(4);
    Employee *emp1 = new Employee("Joe", 15.0, 45.0);
    Employee *emp2 = new Employee("Sally", 25.0, 35.0);
    Employee *emp3 = new Employee("Mary", 32.0, 55.0);
    Employee *emp4 = new Employee("John", 18.0, 32.0);
    
    myVector.push_back(emp1);
    myVector.push_back(emp2);
    myVector.push_back(emp3);
    myVector.push_back(emp4);
    
    for (int i = 0; i <= myVector.size() - 1; i++)
    {
        myVector[i]->calculatePay();
        myVector[i]->display();
    }
    

    return 0;
}

头文件

#include <iostream>

using namespace std;
#ifndef EMPLOYEE_H
#define EMPLOYEE_H

class Employee {
public:
    string name;
    double payRate;
    double hours;
    double gross;
    Employee * next;
    
    Employee();
    Employee(string name, double payRate, double hours);
    void display();
    void calculatePay();
    Employee(const Employee& orig);
    virtual ~Employee();
private:

};

#endif /* EMPLOYEE_H */

源文件

#include <iomanip>
#include "Employee.h"

Employee::Employee() {
    
    name = "";
    payRate = 0.0;
    hours = 0.0;
    gross = 0.0;
    
    
}
Employee::Employee(string name, double payRate, double hours)
{
    this->name = name;
    this->payRate = payRate;
    this->hours = hours;
}
void Employee::display()
{
    cout << setprecision(2) << fixed << endl;
    cout << "Name: " << name << endl;
    cout << "Pay Rate: " << payRate << endl;
    cout << "Hours: "  << hours << endl;
    cout << "Gross: "  << gross << endl;
}
void Employee::calculatePay()
{
    if (hours > 40)
    {
        gross = ((hours - 40) * payRate * 1.5) + (40 * payRate);
    }
    else
    {
        gross = hours * payRate;
    }
}

Employee::Employee(const Employee& orig) {
}

Employee::~Employee() {
}

标签: c++

解决方案


向量的声明

vector<Employee *> myVector(4);

告诉它分配4个元素。元素被初始化为nullptr。使用push_back()将在 null 元素之后添加元素。

在那之后,在线路

myVector[i]->calculatePay();

nullptr取消引用并导致分段错误。

您应该删除向量构造函数的参数以创建一个空向量。如果你想提前预留空间push_back(),你应该使用reserve()

vector<Employee *> myVector;
myVector.reserve(4);

还有循环

for (int i = 0; i <= myVector.size() - 1; i++)

还不错(对于这种情况,向量不为空),但不是以通常的方式。它应该是:

for (size_t i = 0; i < myVector.size(); i++)

推荐阅读