Auch ein Klassen-Problem



  • Moin,
    ich hab mich schon durch Dauermuedes Problem gekämpft, komme aber mit meinem nicht zurecht.
    Dabei habe ich zwei Probleme:
    1.) egal , wie ich _eof setze, ich erhalte immer falsch in der Ausgabe
    2.) der stringerror
    Danke für Hinweise
    Hanns

    make -f mytest.mak.

    g++ -c -Wall mytest.cc
    In file included from mytest.cc:12:
    btrieveClass.hh:31: error: 'string' is used as a type, but is not defined as a
    type.

    btrieveClass.hh:37: error: parse error before `)' token

    mytest.cc: In function int main()': mytest.cc:24: error:datenpfad' undeclared (first use this function)
    mytest.cc:24: error: (Each undeclared identifier is reported only once for each
    function it appears in.)
    make: *** [mytest.o] Error 1

    main-routine

    /*
    #include <iostream>
    #include "btrieveClass.hh"
    
    using namespace std;
    
    btrieve arzt;
    
    //   die hauptroutine                       
    int main() {
            cout << "arzt.eof()       : " << (arzt.eof()? "wahr":"falsch") << endl;
            cout << "arzt.datenpfad() : " << arzt.datenpfad() << endl;
    return 0 ;
    }
    

    btrieveClass.cc

    #include <iostream>
    #include <string>
    #include "btrieveClass.hh"
    
    // allgemeinder Konstruktor
    btrieve::btrieve () {
            bool _isOpen            = true;
            bool _eof               = true;
            bool _bof               = true;
            bool _found             = false;
            bool _seekExact         = false;
            string _datenpfad       = "irgendetwas";
    }
    
    // Destrukor
    btrieve::~btrieve() {
            //      if ( _isOpen ) {
            //              close();
            //      _isOpen = false;
            //      }
    }
    
    // DateiEnde ?
    bool btrieve::eof(){
            return _eof;
    }
    
    // datenPfad
    string btrieve::datenpfad(){
            return _datenpfad;
    }
    

    btrieveClass.hh

    #ifndef _BTRIEVECLASS_H_
    #define _BTRIEVECLASS_H_
    
    #define _DB_DEBUG_
    
    class btrieve {
    
    private:
    
            bool _eof;                                      // EndOfFile_Merker
            bool _bof;                                      // BeginOfFile_Merker
            bool _found;                                    // gefunden_Merker
            bool _isOpen;                                   // Datei ist geöffnet
            bool _seekExact;                                // schalter fürs Suchen: OFF => Vergleich nur auf Lanäge des Suchstrings
            string _datenpfad;                              // selbiger
    
    public:
            btrieve();                                      // Konstruktor
            ~btrieve();                                     // DeKonstr.
            bool eof();                                     // dateiende erreicht
            string datenpfad();                             // liefert den Datenpfad
    };
    
    #endif   // _BTRIEVECLASS_H_
    

    und vorsichtshalber das makefile ( linux -console)

    mytest: mytest.o mytest.mak btrieveClass.o
            g++  mytest.o  btrieveClass.o -omytest
    
    mytest.o: mytest.cc
            g++ -c -Wall mytest.cc
    
    btrieveClass.o: btrieveClass.cc btrieveClass.hh
            g++ -c -Wall btrieveClass.cc
    

    Schon mal herzlichen Dank für Eure Hilfe, werde gelich beim Zahnarzt weiter nachdenken
    Hanns



  • std::string

    Übrigens, dadurch, dass du lokale Variablen mit denselben Namen wie die Member im Konstruktor anlegst, verdeckst du die Member.



  • std:: wars. Ich habe in denb btrieveClass.* ein using namespace std; eingefügt.

    was ich weiter nicht verstehe:
    alle meine bool-variabeln mault gcc an, sie wären unbenutzt. zumindest _eof nutze ich aber, und

    ..lokale Variablen mit denselben Namen wie die Member im Konstruktor anlegst, verdeckst du die Member.

    Ich habe doch die privaten mit "" beginnen lassen. hab es auf my geändert.
    Keine Änderung.
    scheine da was noch nciht verstanden zu haben??
    Hanns



  • Hannsw schrieb:

    Ich habe in denb btrieveClass.* ein using namespace std; eingefügt.

    In der Headerdatei? So was tut man nicht. Schreib std::string aus.

    Hannsw schrieb:

    scheine da was noch nciht verstanden zu haben??

    Mit der Zeile

    bool _isOpen            = true;
    

    im Konstruktor von btrieve legst du eine neue, lokale Variable an. Die wird wieder zerstört, wenn der Konstruktor beendet ist. Da sie genauso heißt, wie eine Membervariable von btrieve, verdeckt sie diese.

    Ich nehme an, das ist nicht, was du beabsichtigt hattest. Vermutlich willst du hier der Membervariablen einen Wert zuweisen. Das müsste dann so aussehen:

    _isOpen            = true;
    


  • Aha, allerdings hängt der groschen noch in der Mitte:
    ich habe in der Header-datei meine "internen" ( lokale ) Vars aus der classen deklaration teil-"private" rausgenommen.
    Dabei klappt es mit zwei Versionen, aber warum und mit welchem Unterschied?

    Heißt der folgende code: alle Module, die diesen Header einbinden kennen**_eof** ?

    #ifndef _BTRIEVECLASS_H_
    #define _BTRIEVECLASS_H_
       bool _eof;                                      // EndOfFile_Merker
    class btrieve {
           // mehr
    private:
        // mehr
    }
    

    Und dieser: alle Instanzen dieser Klasse haben die lokale Variable _eof ?

    #ifndef _BTRIEVECLASS_H_
    #define _BTRIEVECLASS_H_
    class btrieve {
       bool _eof;                                      // EndOfFile_Merker
           // mehr
    private:
        // mehr
    }
    

    Hanns 😕



  • HannsW schrieb:

    Heißt der folgende code: alle Module, die diesen Header einbinden kennen**_eof**?

    Ja, und zwar als globale Variable, die nichts mehr mit der Klasse zu tun hat. Und sobald du diese Headerdatei in mehr als einer .cpp-Datei einbindest, beschwert sich der Linker.

    Und dieser: alle Instanzen dieser Klasse haben die lokale Variable _eof ?

    Jede Instanz dieser Klasse hat eine Membervariable _eof. Lokal ist da nichts.



  • Wenn du eine einzige Variable für alle Objekte dieser Art (Instazen dieser Klasse) haben willst, mach sie static:

    class btrieve
      {
      private:
      static bool _eof;
      //...
      };
    
      btrieve::_eof = false; //in der cpp-Datei die Variable initialisieren.
    


  • Nein, es soll schon jede Instanz ne eigene Variuble haben, jeder macht ja auch später seine eigene Datei auf.

    Was ist der Unterschied, wenn di eVar einmal in class {} und einmal außerhalb erklärt wird?



  • HannsW schrieb:

    Was ist der Unterschied, wenn di eVar einmal in class {} und einmal außerhalb erklärt wird?

    Das hab ich doch oben beschrieben 😕

    Member <-> global



  • ausserhalb ist sie global und innerhalb der klasse hat nur die klasse zugriffsrechte darauf, ausser du änderst die zugriffsrechte.

    http://www.cpp-tutor.de/cpp/le09/le09_01.htm


Anmelden zum Antworten