Problem mit privaten Datenelement
-
Hallo,
bin noch blutiger C++-Anfänger und hab grad ein Problem mit einem privaten Datenelement meiner Klasse...Folgend erstmal die Quelltexte:
cat.hpp
#include <iostream.h> class Cat { public: Cat (int initialAge); ~Cat(); int GetAge(); void SetAge(int Age); void Meow(); private: int itsAge; }; Cat::Cat(int initialAge) { itsAge = initialAge; } Cat::~Cat() { } int Cat::GetAge() { return itsAge; } void Cat::SetAge(int Age) { itsAge=Age; } void Cat::Meow() { cout<<endl<<"\nMiau!\n\n"; }main.cpp
#include "cat.hpp" int main() { Cat Frisky(5); Frisky.Meow(); cout<<"Frisky ist eine Katze und "<<Frisky.GetAge()<<" Jahre alt!"; Frisky.Meow(); Frisky.SetAge(7); cout<<"Jetzt ist Frisky "<<Frisky.GetAge()<<" Jahre alt!"; getchar(); return 0; }Jetzt das Problem, der Compiler sagt mir folgendes:
In function 'int GetAge()'
'itsAge' not declared in this scopeDas gleiche gilt für die Funktion 'int SetAge()'
Verstehe nicht warum er die Variable aus dem private Bereich in meiner Cat-Klasse nicht erkennt...
Naja vielen dank wer sich mal damit befasst :p
-
Wahrscheinlich ein Tippfehler (und dann per Copy&Paste von getAge() in SetAge(9 gewandert.
Gruß,
Simon2.
-
Habe hier kein Copy&Paste verwendet, außerdem kann ich keinen Tippfehler feststellen...
Glaub das hat hier irgendnen Programmiertechnischen-Aspekt wo ich etwas durcheinander gebracht haben muss.
-
Grok schrieb:
...
Glaub das hat hier irgendnen Programmiertechnischen-Aspekt wo ich etwas durcheinander gebracht haben muss.Glaube ich nicht ... ich habe den Source 1:1 rauskopiert und außer der "deprecated"-Warnung bzgl. iostream.h keinerlei Fehlermeldungen erhalten.
Eine Möglichkeit ist noch, dass Du vor get/setAge() kein "Cat::" stehen hast (oder es inline implementieren wolltest, aber zwischendrin schon ein "};" gesetzt hast).Übrigens: Du solltest Dich entscheiden, ob Du die Funktionen
- im Header UND innerhalb der Klassendefinition oder
- außerhalb des Headers (in eigenem cpp, das Du dazulinkst) implementieren möchtest.
So wie Du es angefangen hast, bekommst Du ganz schnell "double definition" Fehler beim Linken .... (sobald Du cat.hpp in mehreren Modulen nutzen möchtest).
Gruß,
Simon2.
-
Außerdem sollten noch Include-Guards in den Header rein.
#ifndef catHpp #define catHpp ... #endif
-
Naja hatte das ganze erst als inline geschrieben und dann umgeändert weil ich den Überblick nicht mehr ganz hatte.
Hab jetzt nochmal das Teil neu getippt. Einmal inline und einmal mit der implementierung ausserhalb der Cat-Klasse. Funktionieren jetzt beide wunderbar.
Andere Frage, macht es einen Unterschied vom Programmieren her, ob inline in der Klasse oder nicht? Ausser natürlich, dass man den Sprung im Speicher umgeht.

Trotzdem schon mal THX

-
Braunstein schrieb:
Außerdem sollten noch Include-Guards in den Header rein.
#ifndef catHpp #define catHpp ... #endif*g* das sagt mir bis jetzt noch gar nix. Welchen Vorteil bringt mir der Guard.. ggf. Fehlerkontrolle??? Dann wäre das natürlich extrem sinnvoll
-
Das verhindert Mehrfachinkludierungen in eine Übersetzungseinheit. Google doch einfach mal danach.
-
In den technischen Auswirkungen sollte es keinen Unterschied machen, ob eine Funktion inline definiert wird oder nicht (wenn doch, such dir einen anderen Compiler) - lediglich auf die Geschwindigkeit und Programmgröße hat das einen Einfluß*. Aber im Endeffekt entscheidet der Compiler eh selber, was er inline anlegen will.
* das reinkopieren der inline-Funktion anstelle eines Aufrufes erzeugt idR schnelleren (kein Funktionsaufruf notwendig), aber auch größeren (der Rumpf der Funktion ist idR umfangreicher als ein 'call xyz') Code.
-
Grok schrieb:
Braunstein schrieb:
Außerdem sollten noch Include-Guards in den Header rein.
#ifndef catHpp #define catHpp ... #endif*g* das sagt mir bis jetzt noch gar nix. Welchen Vorteil bringt mir der Guard.. ggf. Fehlerkontrolle??? Dann wäre das natürlich extrem sinnvoll
Ganz einfach:
Jedesmal wenn du
#include <foo.h>
im Code hast, lädt der der Compiler/Präprozessor die Datei. Wenn sie schon eingefügt wurde, hast du mehrfache Definitionen, weil der Präprozessor sich nicht darum schert, ob die jetzt schon eingebaut ist oder nicht. Er vertraut dem Programmierer. Und deswegen macht man das so. Wenn eben catHpp nicht definiert ist, baut er die Datei ein, wenn catHpp definiert ist, überspringt er sie einfach.
Fehlervermeidung ist hier das Stichwort.
rya.
-
Grok schrieb:
Naja hatte das ganze erst als inline geschrieben und dann umgeändert weil ich den Überblick nicht mehr ganz hatte.
Hab jetzt nochmal das Teil neu getippt. Einmal inline und einmal mit der implementierung ausserhalb der Cat-Klasse. Funktionieren jetzt beide wunderbar....
Und was "lernt Dich das" ?
=> Gib uns den Code, in dem der Fehler ist und keinen anderen.
(Nachsatz: Und wenn hier jemand behauptet, der gelieferte Code passe nicht zum Fehler - prüfe das erst gegen bevor Du ihm widersprichst):p

Gruß,
Simon2.