4

我有两个类,PersonnelLists 和 Employee。我在 main 中创建了 PersonnelLists 的一个实例,如下所示:

int main() {
    PersonnelLists example; //Make a personnel list
...
}

PersonnelLists 使用具有员工列表成员初始化、员工数量和数组大小的构造函数:

PersonnelLists::PersonnelLists(): List(new Employee[SIZE]), numEmployees(0), arraySize(SIZE){
}

这导致创建了一些空的空员工(我认为?):

Employee::Employee(): employeeNumber(0), name(NULL), department(NULL) {
}

正是在这一行,我得到了一个无效的空指针错误。

我是 C++ 新手,刚从 Java 编程中走出来。我仍然是一个新手,所以我不太确定我在这里做错了什么。

更新:根据要求,这是 Employee 的类定义:

#include <iostream>

class Employee {
    public:
        Employee(); //constructor
        Employee(std::string name, std::string deparment);
        void Print() const; //Print this employee's details
        void setEmployeeNo(int employeeNum);

    private:
        int employeeNumber;
        std::string name;
        std::string department;
};
4

3 回答 3

3

在 Java 中,创建一个引用new Employee[SIZE]数组。null

在 C++ 中,创建new Employee[SIZE]一个由. 您的默认构造函数尝试设置和to 。尝试初始化 a会给出您描述的错误。EmployeenamedepartmentNULLstd::stringNULL

C++ 中没有“null”字符串,但您可以默认构造nameand department,这会将它们设置为空字符串:

Employee::Employee(): employeeNumber(0), name(), department() {

最后,如果List可以包含可变数量的元素,我建议您使用std::vector<Employee>(类似于ArrayList<Employee>Java 中的)。

于 2013-03-01T16:36:01.877 回答
1

如果nameanddepartmentstd::strings(或类似的字符串类型),那么用NULL(空字符指针)初始化它们是无效的。

如果我猜对了,您应该改为默认初始化它们,如下所示:

Employee::Employee(): employeeNumber(0), name(), department() {
}

但是如果没有看到Employee.

正如其他人指出的那样,您应该使用 astd::vector而不是数组。这允许您Employee在“列表”中仅包含有效对象。

于 2013-03-01T16:43:45.283 回答
1

我不知道你的类的实际定义是什么,所以很难确定你的问题。

但是现代 C++ 中的一个选项是std::vector<Employee>在类中使用数据成员PersonnelListstd::vector可以在运行时动态增长,使用它的push_back()方法,例如

#include <vector> // for std::vector

class Employee
{
  ....
};

class PersonnelList
{
public:
    PersonnelList()
    {
        // Nothing to do - vector is initialized empty
    }

    // Get current employee count
    size_t Count() const
    {
        return m_employees.size();
    }

    // Add a new employee to the personnel
    void AddEmployee(const Employee& newEmployee)
    {
        m_employees.push_back(newEmployee);
    }

private:
    std::vector<Employee> m_employees;
};

无需使用原始指针或类似的东西:健壮的 RAII STL 容器类使您的代码更简单。

于 2013-03-01T16:43:57.523 回答