error c2011 trotz guard



  • Hallo,
    ich beginne gerade für die Uni etwas zu Programmieren. Ich habe eine main.cpp und eine Class.cpp die ich über den header einbinde. Wenn ich nun Compilieren möchte, bekomme ich die Fehlermeldung:

    "error C2011: 'CCounter': 'class' Typneudefinition".

    Für mich erscheint es so, als ob die Deklaration der Klasse doppelt abläuft. Ich habe aber in der header-Datei einen include-guard gesetzt.

    Hier einmal die Codes:

    main.cpp:

    #include "CCounter2.h"
    #include <iostream>

    using namespace std;

    int main()
    {
    int count_till, count_begin;

    CCounter Counter;

    cout << "Wo soll angefangen werden zu Zählen?\n";
    cin >> count_begin;
    cout << endl;

    cout << "Wie weit soll gezählt werden?\n";
    cin >> count_till;
    cout << endl;

    Counter.setValue(count_begin);

    for (int i=0; i < count_till; i++)
    {
    cout << Counter.getValue();
    Counter.count();
    }

    return 0;
    }

    CCounter2.h:

    //#ifndef Class_Counter
    //#define Class_Counter

    #pragma once
    class CCounter
    {
    public:
    CCounter();
    void count();
    int getValue();
    void setValue(int value);

    private:

    int m_num;
    };

    //#endif

    Class.cpp:

    #include "CCounter2.h"

    using namespace std;

    class CCounter
    {
    public:

    CCounter::CCounter
    {
    m_num=0;
    }

    void CCounter::count()
    {
    m_num = m_num++;
    }

    int CCounter::getValue()
    {
    return m_num;
    }

    void CCounter::setValue(int value)
    {
    m_num = value;
    }

    private:

    int m_num;
    };

    Kann mir jemand den Fehler erklären? Und des weiteren wird das "std" im der Class nicht highlighted -woran liegt das?

    Vielen Dank schon einmal,

    Gruß



  • ich habe in der header datei beide include-guards einmal ausprobiert, daher gibt es beide....



  • Warum machst du in Class.cpp nochmal eine Klassendefinition?



  • Ist das so? In der Header-Datei Definiere ich einmal die Funktionen und ich dachte nun, dass ich in der Class.cpp alles Deklariere. Und die Deklaration mache ich mit Hilfe des Scopes :: sichtbar.

    Wie sollte es denn aussehen, sodass es in der Class.cpp eine Deklaration ist?

    Gruß



  • moritzfigu schrieb:

    In der Header-Datei Definiere ich einmal die Funktionen und ich dachte nun, dass ich in der Class.cpp alles Deklariere.

    Du wirfst die Begriff Deklaration und Definition durcheinander.

    moritzfigu schrieb:

    Und die Deklaration mache ich mit Hilfe des Scopes :: sichtbar.

    Auch hier ist deine Begriffsbenutzung merkwürdig. Wo hast du dir das denn abgeguckt?

    moritzfigu schrieb:

    Wie sollte es denn aussehen, sodass es in der Class.cpp eine Deklaration ist?

    Es geht nicht darum, dass du in Class.cpp statt einer Definition eine Deklaration brauchst. Du darfst einfach die Klasse nicht zweimal definieren.

    #include "CCounter2.h" 
    
     CCounter::CCounter : m_num(0) {}
    
     void CCounter::count() 
     { 
     ++m_num; 
     } 
    
     int CCounter::getValue() const
     { 
     return m_num; 
     } 
    
     void CCounter::setValue(int value) 
     { 
     m_num = value; 
     }
    


  • Vielen Danke, dass hat mich schon einmal deutlich weiter gebracht.
    Ich dachte, ich muss in der .cpp noch einmal sagen, dass es sich um diese Klasse handelt, aber dieses wird ja schon durch Class::funktion sichtbar.

    jetzt habe ich nur noch ein Problem mit dem Konstruktor.

    error C2470

    Sieht wie eine Funktionsdefinition aus, es ist aber keine Parameterliste vorhanden; sichtbarer Funktionstext wird übersprungen.

    Und muss ich

    int m_num
    

    nicht noch einmal in der .cpp aufführen, oder kennt er das nun schon aus der Header-Datei?



  • moritzfigu schrieb:

    jetzt habe ich nur noch ein Problem mit dem Konstruktor.

    Hab die Klammern vergessen.

    CCounter::CCounter() : m_num(0) {}
    

    moritzfigu schrieb:

    Und muss ich

    int m_num
    

    nicht noch einmal in der .cpp aufführen

    Nein.



  • Super, vielen Dank!


Log in to reply