Variable undeclared, obwohl sie im header steht
-
Hi, ich bin mitlerweile echt Ratlos.
Versuche seit gestern Mittag mein Programm neu strukturiert echt OOP zu machen und komme da mit C++ (header files) einfach nicht klar. (in java mit oop kein problem...)Ich versuche quasi das Interface (Schnittstellt der Klasse) als header Datei auszulagern und in der .cxx dann nur die implementation der Methoden/ctor/dtor etc zu haben. Ist die Idee überhaupt umsetzbar? Oder sollte ich diese
void foo(); Deklarationen lieber in die Klassen-Datei schreiben?
Von mir aus kanns auch alles in der .cxx stehen und ich komme ohne header aus. Hauptsache es läuft endlich
Auch sichtbarkeiten innerhalb meines Programms sind mir egal. Darf auch alles public sein wenns hilft..Ich habe nun ein minimal-Beispiel konstruiert, wo mein Problem auftritt:
/* Konto.hxx */ class Konto { public: // Konstruktor(en) & Destruktor(en) Konto(int); ~Konto(void); // Funktion(en) int gibKontostand(void); private: int _stand; };/* Konto.cxx */ #include <iostream> #include "Konto.hxx" // Konstruktor Konto::Konto(int geld) : _stand(geld) { std::cout << "Konto erstellt mit " << _stand << " Geld drauf\n"; } // Desktruktor Konto::~Konto(void) { _stand = 0; } // Funktion(en) int gibKontostand(void) { return _stand; }/* Bank.cxx */ #include <iostream> #include "Konto.hxx" int main() { Konto kto1(3); Konto kto2(55); std::cout << "Kto1 hat " << kto1.gibKontostand() << " Geld drauf\n"; std::cout << "Kto2 hat " << kto2.gibKontostand() << " Geld drauf\n"; }Die Fehlermeldung sieht dann so aus:
In function
int gibKontostand()':_stand undeclared (first use of this function)
(Each undeclared identifier is reported only once for each function it appears in.)Ich benutze das bekannte aktuell/neuste Bloodshed Dev-C++ 4.9.9.2 mit dem dazugehörigen GCC 3.4.2 unter WinXP 32bit
Pls help me

Ich scheine da grundsätzlich nicht verstanden zu haben, wie das mit diesem prä-definieren in header files funktioniert.
Aber wie gesagt. Ich habe auch schon versucht auf die .hxx zu verzichten und alles in der .cxx zu behalten.
Das beste was ich mal erreicht habe, war ein lauffähiges Programm, was statt den Kontoständen dann die Speicher-Adressen der Kontostände ausgegeben hat.
Habe mir bereits einige Tutorials zu header files / Konstruktoren etc angeschaut aber konnte nieie erkennen, was bei mir denn nun falsch läuft
-
du hast "gibKontostand" nicht richtig definiert
du hast den klassennamen vergessenint Konto::gibKontostand(void) // <-- da { return _stand; }das bedeutet das die klasse "Konto" das gibKontostand nicht definiert hat,
und es eine funktion gbKontostand gibt, welche in der gegend rumfliegt und eine unbekannte variable abfragt
-
/* Konto.hxx */ #if !defined(KONTO_HEADER) #define KONTO_HEADER; class Konto { public: // Konstruktor(en) & Destruktor(en) Konto(int geld); // <-- Unsitte im Header den Bezeichner dies wegzulassen, der // Header wird gelesen! Davon abgesehen was soll das sein, Euro/Mark...? ~Konto(); // <-- (void) ist unnötig () // Funktion(en) int gibKontostand(); private: int _stand; }; #endif/* Konto.cxx */ #include <iostream> #include "Konto.hxx" // Konstruktor Konto::Konto(int geld) : _stand(geld) { std::cout << "Konto erstellt mit " << _stand << " Geld drauf\n"; } // Desktruktor Konto::~Konto(void) { // _stand = 0; <-- Unnötig, da eh destruiert } // Funktion(en) int Konto::gibKontostand() // Hier Fehlte "Konto::" { return _stand; }/* Bank.cxx */ #include <iostream> #include "Konto.hxx" int main() { Konto kto1(3); Konto kto2(55); std::cout << "Kto1 hat " << kto1.gibKontostand() << " Geld drauf\n"; std::cout << "Kto2 hat " << kto2.gibKontostand() << " Geld drauf\n"; }
-
Ja, du hast natürlich recht.
Blöderweise behebt das sogar den Fehler..
Aber in meinem echten Programm habe ich (gerad nochmal geprüft) tatsächlich vor jeder Funktions-Implementation brav den Klassen-Namen geschrieben und habe trotzdem genau das gleiche Problem.
Der code ist nur so ewig lang.. will euch das nich zumuten
Ich werd mal versuchen alles überflüssige wegzulassen und dann den code zu posten, der diesen Fehler produziertdanke schonmal
-
D0n schrieb:
Aber in meinem echten Programm habe ich (gerad nochmal geprüft) tatsächlich vor jeder Funktions-Implementation brav den Klassen-Namen geschrieben und habe trotzdem genau das gleiche Problem.
Dann achte mal darauf ob der Name wirklich identisch geschrieben ist etc.
Der Fehler wird dann ausgegeben, wenn keine Variable diesen Namens existiert (Bei einer Methode wird der Name wie folgt gesucht: a) lokale Bezeichner b) Bezeicher der Klasse c) globale Bezeicher).cu André
-
wie sieht den die genaue fehlermeldung aus ?
-
Hier mal nur der Teil mit den Konstruktoren der das Problem verursacht
Ein Teil der Kanjiteil.hxx:
/* Kanjiteil.hxx */ class Kanjiteil { public: // Konstruktor(en) und Desktruktor(en) Kanjiteil(BImage&, int, int);Ein Teil aus der Kanjiteil.cxx:
/* Kanjiteil.cxx */ // Variablen int _breite, _hoehe; // Breite und Hoehe des Teilbildes // [...] hier werden noch mehr Variablen deklariert BImage _bild; // Das Bild des Teilkanjis // Konstruktor(en) Kanjiteil::Kanjiteil(BImage& b, int bre, int hoe) : _breite(bre), _hoehe(hoe) { cout << "Konstruktor gestartet\n"; _bild = b; init(); }Fehlermeldung:
In construktor
Kanjiteil::Kanjiteil(vigra::BImage&, int, int)': class \Kanjiteil' does not have any field named `_breite'
class `Kanjiteil' does not have any field named `_hoehe'
[Build Error] [Kanjiteil.o] Error 1Und noch was:
Wenn ich nun statt
: _breite(bre), _hoehe(hoe)
direkt im {} des Konstruktors schreibe
_breite = bre;
_hoehe = hoe;Gibts keine Fehlermeldung!
Auch das Programm läuft durch - aber es erzeugt keine Ausgaben, die ich zum Testen zwischendurch mit cout eingebaut habe. Sogar wenn ich dem Programm keine 2 Bilddateien als Argument mitgebe (was direkt am Anfang der main mit einem if(argc != 3) geprüft wird gibt es die dazugehörige Fehlermeldung nicht aus
-
sry mein fehler
hatte vergessen in der kanji-datei die variablen deklaration wieder in den header zu schreiben. hatte sie noch /und nur/ in der .cxx
seit sie jetz im header is machts keine fehlermeldung.. aber erzeugt halt auch keine ausgaben. aber das kann ja noch an anderen dingen liegen.
werde jetzt mal weiter suchenvielen dank an alle, die bis hierhin schonmal geholfen haben!