Probleme mit Vererbung
-
Hallo,
ich hab wohl mit meiner Vererbung was falsch gemacht!
LTSubBlock ist Basisklasse, Klasse LTArea erbt von LTSubBlock.
In der Basisklasse LTSubBlock möchte ich als public-methode gerne eine Methode getArea schreiben, die als Rückgabewert LTArea& hat.LTArea& getArea(const LTRectangle a_cBoundingRectangle);
Jetzt krieg ich so ne blöde Fehlermeldung:
error C2143: Syntaxfehler : Fehlendes ';' vor '&'
error C2501: 'LTArea' : Fehlende Speicherklasse oder Typbezeichner
error C2501: 'getArea' : Fehlende Speicherklasse oder TypbezeichnerWAS HAB ICH VERGESSEN
Hier sind die .h-Dateien
Klasse LTSubBlock#ifndef __LTSUBBLOCK_H #define __LTSUBBLOCK_H ////////////////////////////////////////////////////////////////////////////// // includes ////////////////////////////////////////////////////////////////////////////// #include <stdlib.h> #include <stdio.h> #include <iostream> #include <string> #include <vector> #include <algorithm> #include <fstream> #include <math.h> #include "LTRectangle.h" ////////////////////////////////////////////////////////////////////////////// using namespace std; ////////////////////////////////////////////////////////////////////////////// class LTSubBlock { public: ///////////////////////////////////////////////////////////////////////////// // Constructors ///////////////////////////////////////////////////////////////////////////// public: LTSubBlock (); LTSubBlock (const LTSubBlock& a_rSubBlock); LTSubBlock (const LTSubBlock* a_pSubBlock); LTSubBlock& operator=(const LTSubBlock& a_rSubBlock); ///////////////////////////////////////////////////////////////////////////// // Destructor ///////////////////////////////////////////////////////////////////////////// virtual ~LTSubBlock(); ///////////////////////////////////////////////////////////////////////////// // Methods ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // Public Interface ///////////////////////////////////////////////////////////////////////////// void setBoundingRectangle(const LTRectangle& a_cRectangle); LTRectangle& getBoundingRectangle (); LTArea& getArea(const LTRectangle a_cBoundingRectangle); ostream& operator<<(ostream &a_rStream, LTSubBlock& a_cSubBlock); #endif
Klasse LTArea erbt von LTSubBlock
#ifndef __LTAREA_H #define __LTAREA_H #include <stdlib.h> #include <stdio.h> #include <iostream> #include <string> #include <vector> #include <algorithm> #include <fstream> #include <math.h> #include "LTSubBlock.h" ////////////////////////////////////////////////////////////////////////////// using namespace std; class LTArea : public LTSubBlock { public: // typedef ///////////////////////////////////////////////////////////////////////////// // Lifecycle ///////////////////////////////////////////////////////////////////////////// // Constructors ///////////////////////////////////////////////////////////////////////////// LTArea (); LTArea (const LTArea& LTArea); LTArea (const LTArea* LTArea); LTArea& operator=(const LTArea& LTArea); // Destructor ///////////////////////////////////////////////////////////////////////////// virtual ~LTArea(); ///////////////////////////////////////////////////////////////////////////// // Methods ///////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// // Public Interface //////////////////////////////////////////////////////////////////////////// LTArea operator + (LTArea& a_rArea); LTArea& operator += (LTArea& a_rArea); //////////////////////////////////////////////////////////////////////////// // friends //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// // Private methods //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// // Private properties //////////////////////////////////////////////////////////////////////////// private: LTDouble m_dAngle; }; #endif
-
Schreib mal ein
class LTArea;
vor die Definition von LTSubBlock. Und in Headern nach Möglichkeit niemals ein using namespace std; o.ä. platzieren.
-
Das Design schaut merkwürdig aus. (Die Basisklasse sollte nicht über die nachfahren wissen müssen).
Bei Referenzen oder Zeigern kannst Du es mal mit
class LTArea;
in LTSubBlock.h vor class LTSubBlock { versuchen.
Und bau das using namespace std; aus Deinem Header raus. Macht Dir mehr Ärger als es nutzen hat.
[edit]mal wieder zu langsam[/edit]
-
Hab's so umgeschrieben:
class LTArea; class LTSubBlock{ ... }
Jetzt klappt's!!!
Wieso macht using namespace das Programm langsamer???
-
Nein langsamer nicht, aber ärgerlicher.
Die Namensräume sollen Namenskonflickte verhindern.
Wenn jetzt jemand einen Namensconflickt hat ( [url="http://c-plusplus.net/forum/viewtopic.php?t=58293"]weil er z.B. ne eigene copy schreibt[/url] und Deinen Header verwenden würde hätte er keine Chance mehr die Mehrdeutigkeit vernünftig aufzuheben.Das using namespace gilt überall da wo Dein Header includiert wird und das kann sehr ärgerlich für den Anwender der Klasse werden.
In der .cpp ist es Dein Problem und da kannst es machen