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
Hannsmake -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 1main-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 ; }#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.ccSchon 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.