エラー: ISO C++ では非定数静的メンバーのクラス内初期化が禁止されています 質問する

エラー: ISO C++ では非定数静的メンバーのクラス内初期化が禁止されています 質問する

これはヘッダーファイルです: 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;

理由は、このような初期化をヘッダー ファイルに配置すると、ヘッダーが組み込まれているすべての場所で初期化コードが重複してしまうためです。

おすすめ記事