it-swarm.com.de

fehler: ISO C++ verbietet die In-Class-Initialisierung eines statischen Nichtkonstantenelements

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.

12
mishelashala

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. 

45
PMF

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;
}
1
mucaho