У меня есть два класса, 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;
};
В 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>
на Яве).
Если name
а также department
являются std::string
s (или подобный тип строки), затем инициализируя их NULL
(нулевой символьный указатель) недействителен.
Если я угадала, вы должны вместо этого инициализировать их по умолчанию, как:
Employee::Employee(): employeeNumber(0), name(), department() {
}
Но мы действительно не можем сказать, не видя определения класса Employee
,
Как уже отмечали другие, вы должны использовать std::vector
вместо массива. Это позволяет вам только
иметь действительный Employee
объекты в вашем «списке».
Я не знаю, каковы фактические определения ваших классов, поэтому довольно сложно определить вашу проблему.
Но вариант в современном 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 делают ваш код проще.