4

PersonnelLists と Employee の 2 つのクラスがあります。次のように、メインに PersonnelLists のインスタンスを作成します。

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

PersonnelLists は、従業員のリスト、従業員の数、および配列のサイズのメンバー初期化でコンストラクターを使用します。

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

これにより、いくつかの null の空の従業員が作成されます (私は思いますか?):

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

この行で、無効なヌル ポインター エラーが発生します。

私は C++ を初めて使用し、Java プログラミングを始めたばかりです。私はまだポインターの初心者なので、ここで何が間違っているのかよくわかりません。

更新: 要求に応じて、従業員のクラス定義は次のとおりです。

#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]デフォルトで構築された のインスタンスの配列を作成しますEmployee。デフォルトのコンストラクターは と を設定しようnamedepartmentNULLます。std::stringtoを初期化しようとすると、NULL説明したエラーが発生します。

C++ には「null」文字列はありませんが、 and をデフォルトで構築nameしてdepartment、それらを空の文字列に設定することができます。

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

最後に、List可変数の要素を含めることができる場合は、( Javastd::vector<Employee>と同様) を使用することをお勧めします。ArrayList<Employee>

于 2013-03-01T16:36:01.877 に答える
1

namedepartmentstd::strings (または同様の文字列型) である場合、(ヌル文字ポインター) でそれらを初期化することはNULL無効です。

私の推測が正しければ、代わりに次のようにデフォルトで初期化する必要があります。

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

しかし、 のクラス定義を見ないとわかりませんEmployee

他の人が指摘したstd::vectorように、配列の代わりに a を使用する必要があります。Employeeこれにより、「リスト」に有効なオブジェクトのみを含めることができます。

于 2013-03-01T16:43:45.283 に答える
1

クラスの実際の定義がわからないので、問題を特定するのはちょっと難しいです。

しかし、それを行う最新の C++ のオプションは、クラスstd::vector<Employee>内でデータ メンバーを使用することです。そのメソッドを使用して、実行時に動的に成長できます。PersonnelListstd::vectorpush_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 に答える