dies ist die Header-Datei: 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)
Überladener Konstruktor
: firstName(first),
firstName überladener Konstruktor
lastName(last)
lastName überladener Konstruktor
{ //The constructor start
++counter;
für jedes erstellte Objekt wird ein Plus hinzugefügt.
cout << "Employee constructor for " << firstName
<< ' ' << lastName << " called." << endl;
}
~Employee() {
Zerstörer cout << "~ Employee () forderte" << firstName << '' << lastName << endl;
Gibt den Vor- und Nachnamen jedes Objekts zurück
--counter;
Zähler minus eins
}
string getFirstName() const {
return firstName;
}
string getLastName() const {
return lastName;
}
static int getCount() {
return counter;
}
private:
string firstName;
string lastName;
static int counter = 0;
Hier habe ich den Fehler. Aber warum?
};
hauptprogramm: 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;
Hier wird der Wert des Zählers aus der Klasse aufgerufen
{
Starten Sie einen neuen Gültigkeitsbereich
Employee e1("Susan", "Bkaer");
Initialisieren Sie das e1-Objekt aus der Employee-Klasse
Employee e2("Robert", "Jones");
Initialisieren Sie das e2-Objekt aus der Employee-Klasse
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";
}
beende den Gültigkeitsbereich
cout << "\nNUmber of employees after objects are deleted is "
<< Employee::getCount() << endl; //shows the counter's value
} //End of Main
Was ist das Problem? Ich habe keine Ahnung, was falsch ist Ich habe viel nachgedacht, aber ich weiß nicht, was falsch ist.
Die Initialisierung des statischen Members counter
darf nicht in der Header-Datei enthalten sein.
Ändern Sie die Zeile in der Headerdatei in
static int counter;
Fügen Sie Ihrer employee.cpp die folgende Zeile hinzu:
int Employee::counter = 0;
Der Grund ist, dass das Setzen einer solchen Initialisierung in die Headerdatei den Initialisierungscode an jeder Stelle dupliziert, an der der Header enthalten ist.
Laut einer ähnlichen SO -Antwort gibt es einen anderen Ansatz, der insbesondere für Ihre aktuelle Implementierung geeignet ist (nur-Kopfbibliothek):
// 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
Ich habe mir die Freiheit genommen, std::size
für die Darstellung der nicht negativen Mitarbeiteranzahl und nachgestellten Rückgabesyntax für Funktionen einzusetzen.
Begleittest ( ideone link ):
#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;
}