これはヘッダーファイルです: employee.h
#ifndef EMPLOYEE_H
#define EMPLOYEE_H
#include <iostream>
#include <string>
using namespace std;
class Employee {
public:
Employee(const string &first, const string &last)
オーバーロードされたコンストラクタ
: firstName(first),
firstName オーバーロードされたコンストラクタ
lastName(last)
lastName オーバーロードされたコンストラクタ
{ //The constructor start
++counter;
作成されたオブジェクトごとにプラスが 1 つ追加されます。
cout << "Employee constructor for " << firstName
<< ' ' << lastName << " called." << endl;
}
~Employee() {
デストラクタ cout << "~Employee() が " << firstName << ' ' << lastName << endl; に対して呼び出されました。
各オブジェクトの姓名を返します
--counter;
カウンターマイナス1
}
string getFirstName() const {
return firstName;
}
string getLastName() const {
return lastName;
}
static int getCount() {
return counter;
}
private:
string firstName;
string lastName;
static int counter = 0;
ここでエラーが発生しました。しかし、なぜでしょうか?
};
主プログラム: employee2.cpp
#include <iostream>
#include "employee2.h"
using namespace std;
int main()
{
cout << "Number of employees before instantiation of any objects is "
<< Employee::getCount() << endl;
ここでクラスからカウンターの値を呼び出します
{
新しいスコープブロックを開始する
Employee e1("Susan", "Bkaer");
Employeeクラスからe1オブジェクトを初期化する
Employee e2("Robert", "Jones");
Employeeクラスからe2オブジェクトを初期化する
cout << "Number of employees after objects are instantiated is"
<< Employee::getCount();
cout << "\n\nEmployee 1: " << e1.getFirstName() << " " << e1.getLastName()
<< "\nEmployee 2: " << e2.getFirstName() << " " << e2.getLastName()
<< "\n\n";
}
スコープブロックを終了する
cout << "\nNUmber of employees after objects are deleted is "
<< Employee::getCount() << endl; //shows the counter's value
} //End of Main
何が問題なのでしょう? 何が問題なのか全く分かりません。 いろいろ考えてみたのですが、何が問題なのか分かりません。
ベストアンサー1
の初期化静的メンバーはcounter
ヘッダー ファイルに存在してはなりません。
ヘッダーファイルの行を次のように変更します。
static int counter;
そして、employee.cpp に次の行を追加します。
int Employee::counter = 0;
理由は、このような初期化をヘッダー ファイルに配置すると、ヘッダーが組み込まれているすべての場所で初期化コードが重複してしまうためです。