2

リンカーエラーがあり、理解できないようです。

デフォルトのコンストラクターは、名前を「不明」に、オフィス番号をnextOfficeNoに、従業員番号をnextEmpIdの値に、部門番号を0に、従業員の役職をエントリーレベルに、経験年数を0に、給与を0に設定します。すべての静的属性の値は1ずつ増加します。

2番目のコンストラクターは、関数に渡される内容に基づいて属性を設定します。従業員の給与の値は引き続き0に設定され、OfficeNumberとEmployeenumberの値はそれぞれnextOfficeNoとnextEmpIdに設定されます。この場合も、コンストラクターはすべての静的属性の値を1ずつインクリメントする必要があります。totalNumOfEmployeesの値は、オブジェクトを作成する前に0に初期化し、クラスEmployeeの各オブジェクトを作成するときに(すべてのコンストラクターで)インクリメントし、クラスEmployeeのオブジェクトがスコープ外になると(デストラクタで)デクリメントする必要があります。

nextEmpIdの値は、オブジェクトを作成する前に1000に初期化する必要があり、すべてのコンストラクターでクラスEmployeeの各オブジェクトを作成するときにインクリメントする必要があります。

nextOfficeNoの値は、オブジェクトを作成する前に10に初期化する必要があり、すべてのコンストラクターでEmployeeクラスの各オブジェクトを作成するときにインクリメントする必要があります。

これは私のヘッダークラ​​スです:

#include <iostream>
#include <string>
using namespace std;

class Employee
{
private:
    string name;
    const long officeNo;
    const long empId;
    int deptNo;
    char empPosition; // ‘E’: entry level, ‘M’: manager, ‘D’: Director, ‘P’:Project_leader
    int yearOfExp;
    float salary;
    static int totalNumofEmployees;
    static int nextEmpId;
    static int nextOfficeNo;
public:
    Employee();
    ~Employee();
    Employee(string theName, int theDeptNo, char theEmpPosition, int theYearOfExp);
    void Print() const ;
    void GetInfo();
    friend void setSalary(Employee& );
 };

これが私のCPPクラスです。
コンストラクターに問題があります。

#include "Employee.h"
#include <string>
#include <iostream>

Employee::Employee()
  : officeNo(nextOfficeNo), empId(nextEmpId)
{
    name = "Unknown";
    deptNo = 0;
    empPosition = 'E';
    yearOfExp = 0;
    salary = 0;
    totalNumofEmployees = 0;
    nextEmpId = 1000;
    nextOfficeNo = 10;
    totalNumofEmployees++;
    nextEmpId++;
    nextOfficeNo++;
}

Employee::Employee(string theName, int theDeptNo, char theEmpPosition, int theYearOfExp)
  : officeNo(nextOfficeNo), empId(nextEmpId)
{
    name = theName;
    deptNo = theDeptNo;
    empPosition = theEmpPosition;
    yearOfExp = theYearOfExp;
    salary = 0;
    totalNumofEmployees = 0;
    nextEmpId = 1000;
    nextOfficeNo = 10;
    totalNumofEmployees++;
    nextEmpId++;
    nextOfficeNo++;
}

ここにエラーがあります:

{Undefined symbols for architecture x86_64:
"Employee::nextOfficeNo", referenced from:
Employee::Employee() in Employee.o
Employee::Employee(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int, char, int) in Employee.o
"Employee::totalNumofEmployees", referenced from:
Employee::Employee() in Employee.o
Employee::Employee(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int, char, int) in Employee.o
Employee::~Employee() in Employee.o
Employee::Print() const in Employee.o
"Employee::nextEmpId", referenced from:
Employee::Employee() in Employee.o
Employee::Employee(std::__1::basic_string<char, std::__1::char_traits<char>,  std::__1::allocator<char> >, int, char, int) in Employee.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
}
4

1 に答える 1

3

静的メンバー変数を宣言しましたが、それらを定義するのを忘れました:

§9.4.2/2クラス定義での静的データメンバーの宣言は定義ではなく、cv-qualifiedvoid以外の不完全なタイプである可能性があります。静的データメンバーの定義は、メンバーのクラス定義を囲む名前空間スコープに表示されます。名前空間スコープでの定義では、静的データメンバーの名前は、::演算子を使用してそのクラス名で修飾する必要があります。静的データメンバーの定義の初期化式は、そのクラスのスコープ内にあります。

// Example:
class process {
    static process* run_chain;
    static process* running;
};
process* process::running = get_main();
process* process::run_chain = running;

あなたの場合:

// add this to your .cpp
int Employee::totalNumofEmployees = 0;
int Employee::nextEmpId = 1000;
int Employee::nextOfficeNo = 10;

そして、コンストラクターからこれらの割り当てを削除します。

totalNumofEmployees = 0;
nextEmpId = 1000;
nextOfficeNo = 10;

そうしないと、オブジェクトを作成するたびに、これらの値がリセットされます。

于 2012-11-09T05:34:17.570 に答える