016
01.04.2004, 10:38 Uhr
RHBaum
|
@Windalf
Zitat: |
meine stärke liegt nicht gerade daran api's zu verwenden geschweige denn hinter deren konzepte zusteigen...
|
Das geht schneller als wie du "Hilfe" schrein kannst ! Wenn Du einmal genug Zeit und Energie dafuer hasst, also sprich dich "Hauptberuflich" damit auseinandersetzen musst, gehts ganz flott :-) Im gegenteil, wird zu schnell langweilig meistens
@Rip Allgemein: Deine Scrollerklasse ok ... da blick ich ned genau durch was die genau tut, aber das wirst du schon wissen :-) Warum willst die "unbedingt selber dynamisch" verwalten ? Die hasst ne nette Klasse, schreibst aber ne menge C-Like code drumherum. Das ist nur in den Faellen sinvoll, wo du ganz spezielles Verhalten hasst und vielleicht wo es auf auf maximalste Geschwindigkeit ankommt.
Dein Scrollobj ist der Versuch nen Container zu implementieren ... der name, naja wuerde mir da nicht so gefallen .... ScrollObjManager, oder ScrollObj[List,Set,Map ....] waeren sicher besser :-) Benutz die schon vorhanden Container ! (zum Beispiel die STL, oder die aus ner Anderen Lib die schon eh verwendest) Dein code ist alles andere als Fehlersicher, oder Fehlerneutral ... Sprich wenn du irgendwo nen Fehler geworfen bekommst, ist dein ganzes System instabil .... (soll es sicher auch noch nicht sein, die fertigen container sind es aber meist schon)
C++: |
// Header: "Classes.h" class Scroller { private: int x; int y; int values; float size; char * name; public: Scroller(int _x, int _y, int _values, float _size, char *_name) { x=_x; y=_y; values=_values; size=_size; name=new char[strlen(_name)+1]; strcpy(name,_name); } ~Scroller() { delete []name; } int X() {return x;} int Y() {return y;} int Values() {return values;} float Size() {return size;} char* Name() {return name;} };
|
Denk nicht, das man da nix mehr optimieren kann ! deine Getter veraendern das Objekt nicht !!! Const ist ne nette sache um sich vor sich selbst zu schuetzen, sollte man unbedingt nutzen .... !
char * als member in ner klasse und allokierung im konstruktor ist nicht Fehlersicher .... bei Laufzeitfehlern, wenn die abfaengst, wirst speicherlecks bekommen .... besser: Zeiger auf allocierte Speicherbereiche in smartpointer packen (auto_ptr reicht in deinem fall) ... noch besser: Stringklassen verwenden !!! (std::basic_string) !
Vorschlag: Wenn Sowieso alles inline codest, also deine funktionen im "Header" definierst, dann mach den Stringtyp als Template parameter. Das erhoeht die Wiederverwendbarkeit .....
Weitere Strategie: Spendier deiner Klasse nen Copy Construktor, damit sie in container tun kannst ....
Noch nen Hinweis: Oeffentliche Methoden in der H Datei immer relativ weit vorn schreiben, dann brauchen die Anwender ned deine ganze H Datei druchforsten. finden schneller was sie suchen ... oder du schreibst halt gute Dokus :-)
Noch nen Hinweis: _ als Praefix ist nicht ungefaehrlich, bei manchen compilern bekommst da schwierigkeiten ... hab ich irgendwo mal gelesen. Persoenlich hatte ich noch keine probs mit :-) Verwende die aber auch nicht :p
Noch nen Hinweis: Statt direkte zuweisungen im Ctor lieber Initialisierungslisten verwenden ... Deine Variablen aendern sich auch nie in der klasse, also mach sie const !!! (dann gehts eh nur ueber initialisierungsliste)
Beispiel wie es aussehen koennt ...
C++: |
// Header: "Classes.h"
#include <string> // brauchen wir fuer die std::basic_string<> sache
tempate<class StringType = char> class Scroller { private: typedef std::basic_string<StringType> String_t; public: // Ctor mit parametern Scroller(int aX, int aX, int aValues, float aSize, const StringType * aName): mX(aX), mY(aY), mValues(aValues), mSize(aSize), mName(aName) // Ja das geht !!! :-) { } // CCtor mit parametern Scroller(const Scroller & rx): mX(rx.mX), mY(rx.mY), mValues(rx.mValues), mSize(rx.mSize), mName(rx.mName) // Ja das geht auch !!! :-) { } virtual ~Scroller() // destruktor lieber virtual, falls doch mal wer ableiten moechte ... { // dein destruktur braucht nun gar nix mehr zu tun, wird alles selbst erledigt }
// Deine Getter int X() const {return mX;} int Y() const {return mY;} int Values() const {return mValues;} float Size() const {return mSize;} const StringType * Name() {return mName.c_str();} private: const int mX; const int mY; const int mValues; const float mSize; const String_t mName; };
|
Include Guards nicht vergessen ! :p Das waeren meine Vorschlaege .... zu deiner Scroller klasse .... zu deinem container schreib ich spaeter noch was ....
Ciao ... Dieser Post wurde am 01.04.2004 um 10:45 Uhr von RHBaum editiert. |