web-dev-qa-db-fra.com

erreur: ISO C++ interdit l'initialisation en classe d'un membre statique non const

c'est le fichier d'en-tête: 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) 

Constructeur surchargé

    : firstName(first), 

firstName constructeur surchargé

      lastName(last) 

lastName constructeur surchargé 

    { //The constructor start
    ++counter; 

il ajoute un plus pour chaque objet créé; 

    cout << "Employee constructor for " << firstName
         << ' ' << lastName << " called." << endl;
    }

    ~Employee() { 

Destructor cout << "~ Employee () a appelé" << prenom << '' << lastName << endl; 

Retourne le prénom et le nom de chaque objet

        --counter; 

Compteur moins un

    }

    string getFirstName() const {
        return firstName; 
    }

    string getLastName() const {
        return lastName;
    }

    static int getCount() {
        return counter;
    }
private:
    string firstName;
    string lastName;

   static int counter = 0; 

Voici où j'ai eu l'erreur. Mais pourquoi?

};

programme principal: 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; 

Ici, j'appelle la valeur du compteur de la classe

    { 

Commencer un nouveau bloc de portée

        Employee e1("Susan", "Bkaer"); 

Initialiser l'objet e1 de la classe Employee

        Employee e2("Robert", "Jones"); 

Initialiser l'objet e2 de la classe Employee

        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";
    } 

mettre fin au bloc de la portée

    cout << "\nNUmber of employees after objects are deleted is "
         << Employee::getCount() << endl; //shows the counter's value
} //End of Main

Quel est le problème? Je ne sais pas ce qui ne va pas ... J'ai beaucoup réfléchi, mais je ne sais pas ce qui ne va pas.

12
mishelashala

Le initialization du membre statique counter ne doit pas se trouver dans le fichier d'en-tête. 

Remplacez la ligne dans le fichier d'en-tête par

static int counter;

Et ajoutez la ligne suivante à votre employé.cpp:

int Employee::counter = 0;

La raison en est que le fait de placer une telle initialisation dans le fichier d'en-tête dupliquerait le code d'initialisation à chaque endroit où l'en-tête est inclus. 

45
PMF

Selon une réponse SO similaire , il existe une autre approche, particulièrement adaptée à votre implémentation actuelle (bibliothèque d'en-tête uniquement):

// file "Employee.h"
#ifndef EMPLOYEE_H
#define EMPLOYEE_H

class Employee {
public:
    Employee() {
        getCounter()++;
    }
    ~Employee() {
        getCounter()--;
    }

    static auto getCount() -> std::size_t {
        return getCounter();
    }
private:
    // replace counter static field in class context,
    //    with counter static variable in function context
    static auto getCounter() -> std::size_t& {
        static std::size_t counter = 0;
        return counter;
    }
};

#endif //EMPLOYEE_H

J'ai pris la liberté d'utiliser std::size pour représenter le nombre d'employés non négatif et la syntaxe de retour fin pour les fonctions.

Test d'accompagnement (lien ideone ):

#include "Employee.h"

int main() {
    std::cout << "Initial employee count = " << Employee::getCount() << std::endl;
    // printed "count = 0"

    Employee emp1 {};
    std::cout << "Count after an employee created = " << Employee::getCount() << std::endl;
    // printed "count = 1"

    {
        Employee emp2 {};
        std::cout << "Count after another employee created = " << Employee::getCount() << std::endl;
        // printed "count = 2"
    }
    std::cout << "Count after an employee removed = " << Employee::getCount() << std::endl;
    // printed "count = 1"

    return 0;
}
1
mucaho