Что я сделал не так при кодировании этого массива объектов в C ++?

У меня есть два класса, PersonnelLists и Employee. Я создаю экземпляр PersonnelLists в моем main, примерно так:

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

Решение

В Java new Employee[SIZE] создает массив null Рекомендации.

В C ++ new Employee[SIZE] создает массив по умолчанию экземпляры из Employee, Ваш конструктор по умолчанию пытается установить name а также department в NULL, Попытка инициализировать std::string в NULL даст ошибку, которую вы описываете.

В C ++ нет «нулевой» строки, но вы можете создать конструкцию по умолчанию name а также department, который установил бы их в пустые строки:

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

Наконец, если List может содержать переменное количество элементов, я бы порекомендовал вам использовать std::vector<Employee> (который похож на ArrayList<Employee> на Яве).

3

Другие решения

Если name а также department являются std::strings (или подобный тип строки), затем инициализируя их NULL (нулевой символьный указатель) недействителен.

Если я угадала, вы должны вместо этого инициализировать их по умолчанию, как:

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

Но мы действительно не можем сказать, не видя определения класса Employee,

Как уже отмечали другие, вы должны использовать std::vector вместо массива. Это позволяет вам только
иметь действительный Employee объекты в вашем «списке».

1

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

Но вариант в современном C ++ для этого заключается в использовании std::vector<Employee> элемент данных внутри PersonnelList учебный класс. std::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 делают ваш код проще.

1
По вопросам рекламы [email protected]