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