erreur: ISO C++ forbids initialisation dans les classes de non-const membre statique
c'est le fichier d'en-tête: l'employé.h
#ifndef EMPLOYEE_H
#define EMPLOYEE_H
#include <iostream>
#include <string>
using namespace std;
class Employee {
public:
Employee(const string &first, const string &last)
Surchargé Constructeur
: firstName(first),
prénom surchargé constructeur
lastName(last)
lastName surchargé constructeur
{ //The constructor start
++counter;
il ajoute un plus pour chaque objet créé;
cout << "Employee constructor for " << firstName
<< ' ' << lastName << " called." << endl;
}
~Employee() {
Destructeur
cout << "~Employé() a appelé à une " << prenom <<"'
<< nom << endl;
Retourne le prénom et le nom de chaque objet
--counter;
Contre 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;
C'est là que j'ai obtenu l'erreur. Mais, pourquoi?
};
principale du programme: 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 ir appel te valeur du compteur de la classe
{
Commencer un nouveau champ d'application bloc
Employee e1("Susan", "Bkaer");
Initialiser le e1 objet de classe Employé
Employee e2("Robert", "Jones");
Initialiser le e2 objet de classe Employé
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";
}
fin de l'étendue du bloc
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 n'ai aucune idée de ce qui est mauvais.
J'ai beaucoup réfléchi, mais je ne sais pas ce qui est mal.
Oui, vous avez raison!
Je veux initialiser contre et, plus tard, l'incrémenter avec le constructeur. Puis décrémenter avec le destructeur.
Je ne pense pas que le message d'erreur peut être plus clair.
Le message d'erreur ne vous raconte pas ce qui est mauvais, pas comment résoudre le problème.
OriginalL'auteur mishelashala | 2013-12-01
Vous devez vous connecter pour publier un commentaire.
La initialisation du membre statique
counter
ne doit pas être dans le fichier d'en-tête.Modifier la ligne dans le fichier d'en-tête de
Et ajoutez la ligne suivante à votre employee.cpp:
Raison est que le fait de mettre une telle initialisation dans le fichier d'en-tête de dupliquer le code d'initialisation dans chaque lieu où l'en-tête est inclus.
Où avez-vous mis? Il doit être en dehors de toute fonction, mais où la classe Employé est connu. BTW: Pourquoi votre fichier cpp appelé employee2.cpp? Et y compris employee2.h?
Parce que j'ai fait un autre. Mais il n'a pas d'importance. Merci pour l'info
si c'est la seule raison pourquoi il est empêché, pourquoi const membres sont autorisés? N'ont-ils pas de l'initialisation dans chaque lieu où l'en-tête est inclus aswell?
Pas sûr. Soit il n'a pas d'importance si le membre const obtenu un nouvel emplacement de la mémoire à chaque fois (en fait, existant en plusieurs fois) ou pas du tout (parce qu'il est éliminé par le compilateur)
OriginalL'auteur PMF
Selon une semblable réponse il y a une autre approche, en particulier adapté pour votre application actuelle (en-tête uniquement de la bibliothèque):
J'ai pris la liberté d'utiliser
std::size
pour représenter la non-négative du nombre d'employés et fuite de retour de la syntaxe pour les fonctions.Accompagnement de test (ideone lien):
OriginalL'auteur mucaho