Klassen - "`cout' undeclared (first use this function)"??



  • 1. Nur Header-Dateien inkludieren!
    2. Wenn du C++ programmierst, nenne deine Dateien nicht .c sondern .cpp! (auch Großkleinschreibung beachten!)
    3. .cpp Dateien sind sogenannte Implementierungs-Dateien bzw. -Einheiten. Der Compiler kompiliert diese alle einzeln, deshalb ist es unnötig und sinnlos cpp-Dateien zu inkludieren.



  • Super, vielen Dank für die Infos.

    Ich habe die Files jetzt umbennant (in .cpp) und inkludiere nur noch Header Dateien.

    Dennoch bleibt mir das Problem, dass er nicht meine Variabeln/Klassen innerhalb der Klassendefinitions-Datei findet. 🙄

    Meine Klasse:
    liste.h:

    #include "objekt.h"
    using namespace std;
    
    class Liste{
    Objekt objektListe[50];
    int anzahlElemente;
    
    public:
           Liste();
           Objekt getObjekt(int position);
           void add(Objekt object);
           void insert(Objekt object);
    };
    

    und meine Definionsdatei liste.cpp:

    #include "liste.h"
    using namespace std;
    
    Liste::Liste(){
    anzahlElemente = 0;
    }
    Objekt Liste::getObjekt(int position){
           return objektListe[position];
    }
    
    void add(Objekt object){
    objektListe[anzahlElemente++] = object;
    }
    
    void insert(Objekt object){
    for(int i = ++anzahlElemente; i > 0; i++){
            objektListe[i] = objektListe[i-1];
            }
    objektListe[0] = object;
    ++anzahlElemente;
    }
    

    Es kommt schon wieder die Fehlermeldung, dass die funktion "anzahlVariabeln" (ist ja eigentlich nur eine Integervariabel und keine Funktion...) und "objektListe" nicht findet. 😞
    Was mache ich denn falsch?



  • void add(Objekt object){ 
    objektListe[anzahlElemente++] = object; 
    }
    

    kennt die auch nicht.
    aber

    void Liste::add(Objekt object){ 
    objektListe[anzahlElemente++] = object; 
    }
    

    würde sie kennen.



  • Echt super, danke.
    Ich merk schon, ich bin einfach zu wenig genau und gründlich.

    Auf alle Fälle kann ich das Prgoramm jetzt kompilieren.
    Das ist schon mal ein rieeeeßen Fortschritt.

    Eine sehr komische Fehlermeldung:
    "ISO C++ forbids in-class initialization of non-const static member `anzahlElemente' "

    Wieso verbietet denn ISO mir das Initialsieren meiner Variabeln?



  • ...



  • weil c++ nicht java ist.
    int anzahlElement=0;
    klappt nicht.
    stattdessen darfst nur
    int anzahlElement;
    schreiben und mußt dann im konstruktor
    anzahlElement=0;
    schreiben.



  • @Volkard&Artchi
    Super danke.
    Das kommt davon wenn man von Java umsteigt, mir passieren öfters solche Fehler.
    Ich hab 'anzahlElemente' einfach im Konstruktor einen Wert zugewiesen, jetzt gehts.

    Jetzt bin ich so gut wie fertig, hoffe ich.
    Allerdings erscheint jetzt die Fehlermeldung "redefinition of `class Objekt'".
    Wie soll den das gehen? Ich hab eh nur ein objekt.h File...
    Die Fehlermeldungen werden immer kryptischer...

    objekt.h:

    using namespace std;
    
    class Objekt{
          char text;
          public:
                 Objekt(char eingabe = 'a');
                 void print();
                 char getText();
    };
    

    bzw. meine main datei:

    #include <cstdlib>
    #include <iostream>
    #include "iterator.h"
    #include "objekt.h"
    #include "liste.h"
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        Liste list;
        Iterator it;
        Objekt a('a'), b('b'), c('c'), d('d');
        list.add(a);
        list.add(b);
        list.add(c);
        list.add(d);
        list.getObjekt(it.getPosition()).print();
    //gibt das Objekt an der aktuellen Stelle des Itertors mittels Print aus
        it.increase(); //Operator++
        list.getObjekt(it.getPosition()).print();
        it.decrease();
        list.getObjekt(it.getPosition()).print();
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    🙄

    Zusätzlich wird "objekt.h" noch in liste.h und liste.ccp inkludiert.
    Aber das sollte ja egal sein, oder?



  • Zusätzlich wird "objekt.h" noch in liste.h und liste.ccp inkludiert.
    Aber das sollte ja egal sein, oder?

    und dadurch wird sie in der main zweimal inkludiert, einmal direkt und einmal indirekt über die liste.h

    sorge also dafür, daß trotz zweimaligen lesens der compiler die definition nur einmal sieht. und zwar so:

    datei Objekt.h

    #ifndef OBJEKT_H
    #define OBJEKT_H
    
    //using namespace std; //nicht gut in headers
    
    class Objekt{
          char text;
          public:
                 Objekt(char eingabe = 'a');
                 void print();
                 char getText();
    };
    
    #endif
    


  • Ah, super, das ist sehr praktisch.! 🙂 👍

    Jetzt kann ich das Programm auch endlich ohne Probs kompilieren.

    Allerdings weist er meiner instanzvariabel der Klasse Liste nicht den von mir im Konstruktor bestimmten wert zu.
    Woher kommt das?
    Eigentlich ist der Code ganz simpel, ich find aber meinen Fehler nicht.

    mein main code:

    #include <cstdlib>
    #include <iostream>
    #include "iterator.h"
    #include "liste.h"
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        Liste list;
        Iterator it;
        cout << it.getPosition(); //Hier sollte er '0' ausgeben
    //Er gibt aber irgendeine komische Zahl aus, als hätte ich die Variabel gar nicht initiallisiert
    ...
     system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    und
    mein liste.h Code:

    class Iterator{
          int position;
    public:
           Iterator(); //Konstruktor
           int getPosition();
           void increase();
           void decrease();
    };
    

    mein liste.cpp Code:

    #include "iterator.h"
    using namespace std;
    
    Iterator::Iterator(){ //Konstruktor
    position = 0;
    }
    
    int Iterator::getPosition(){
                  position;
    }
    
    void Iterator::increase(){
    position++;     
    }
    
    void Iterator::decrease(){
    position--;
    }
    


  • Flabian schrieb:

    int Iterator::getPosition(){
                  position;
    }
    

    Du kannst das wirklich ohne Fehlermeldung compilieren ?
    Versuch mal:

    int Iterator::getPosition(){
                 return position;
    }
    


  • Jetzt gehts!

    Hatte einmal ein = statt einem == geschreiben.
    Danke an alle für die viele, echt nützliche Hilfe!!! 🙂 👍 👍


Anmelden zum Antworten