richtige verwendung von const
-
Sollte man in folgendem Beispiel const verwenden?
class Bitmap { public: Bitmap() { Buffer = new unsigned long[64*64]; } public: unsigned long *GetBitmap(void) const //Sollte man hier const verwenden??? { return(Buffer); }; private: unsigned long *Buffer; }
Die Variable Buffer wird dadurch nicht verändert. Mann kann nun aber den Inhalt der Bitmap verändern. Wofür ist const eigentlich gedacht? Als Hinweis für den Compiler, als "read only Beschränkung" für den Programmierer oder für was anderes? Das const scheint mir lückenhaft zu sein.
-
Ganz einfach: sowas macht man nicht.
Du hast Buffer somit quasi public definiert. Das ist natürlich doof.
GetBuffer ist somit _nicht_ const - es sei denn, es würde einen Zeiger auf const returnen.
-
Nun, wenn diese Bitmap-Klasse unabhängig und überall benutzt werden können soll, muss man an die Bilddaten rankommen - also wie anders, als mit ner Get-Methode?
-
Das GetBuffer nicht const ist habe ich mir eigentlich schon gedacht. Aber wie siehts bei "externen" Objekten wie z.b. HWND aus?
class Window { public: Window() { HWND = CreateHWND(); //:) } public: HWND GetHWND(void) const //Sollte man hier const verwenden??? { return(Buffer); }; private: HWND Handle; }
Ist HWND jetzt nur eine Zahl von der eine Kopie gemacht wird und somit konstant, wie z.B. Height oder Width? oder ist es ein Pointer der auf ein Fenster zeigt?
Man kann doch bestimmt an ein Handle für ein Fenster auch mit AfxXXX Funktionen rannkommen. Macht es da überhaut noch Sinn mit const zu arbeiten? Allgemeiner gefragt. Kann man bei "externen Objekten" überhaupt Konstantheit sicherstellen?
Externe Objekte sind doch immer so konstant, wie der programmcode sie konstant macht und nicht wie sie ihre const Anweisungen konstant machen. Wie kann man dann Konstantheit bei externen Objekten sicherstellen, ohne die interna genau zu kennen? Ist deshalb const in c++ nicht lückenhaft?
-
Mein Problem bei der ganzen Sache ist, daß ich nicht weiß, wie ich const richtig verwenden soll, gerade bei Objekten, die _nicht_ von mir geschrieben wurden. Ich sehe irgendwie keinen Sinn darin const bei fremden Objekten zu verwenden, da ich gar nicht sicherstellen kann, daß sie auch tatsächlich konstant sind. Gibt es da irgendwelche Regeln, an die man sich halten kann?
Vielleicht liegt das Problem ja auch darin, das es in C++ Objekte gibt, die gar keine "C++ Objekte" sind, welche sauber mit const programmiert wurden"? HWND ist ja kein C++ Objekt...
-
HWND ist ein typedef auf HWND__*(oder so ähnlich)
mit const arbeiten macht viel sinn, da es einerseits eine hilfe für dich als programmierer ist, da du nicht ausversehen irgendwelche const objekte veränderst, andererseits freut sich auch der compiler drüber, da ein const eine gewisse "sicherheit" darstellt.
in deinem beispiel könnte die methode also ruhig const sein, der pointer wird ja nicht verändert.
Natürlich kommt man wenn man will immer an das fensterhandle, aber wieso einen umständlichen code schreiben, wenn man einfach getHwnd schreiben könnte?Externe Objekte sind doch immer so konstant, wie der programmcode sie konstant macht und nicht wie sie ihre const Anweisungen konstant machen.
const bleibt const, du kannst nicht so ohne weiteres ein const objekt nonconst machen, umgekehrt geht das sogar automatisch.Ist deshalb const in c++ nicht lückenhaft?
nein, es ist nicht deine aufgabe, den code einer dll oder was auch immer const correct zu machen, hauptsache dein code befolgt die const correctness. Const ist eine hilfe für dich als programmierer, wie schon weiter oben angeführt.
-
SniperAK schrieb:
Sollte man in folgendem Beispiel const verwenden?
class Bitmap { public: Bitmap() { Buffer = new unsigned long[64*64]; } public: unsigned long *GetBitmap(void) const //Sollte man hier const verwenden??? { return(Buffer); }; private: unsigned long *Buffer; }
Die Variable Buffer wird dadurch nicht verändert. Mann kann nun aber den Inhalt der Bitmap verändern. Wofür ist const eigentlich gedacht? Als Hinweis für den Compiler, als "read only Beschränkung" für den Programmierer oder für was anderes? Das const scheint mir lückenhaft zu sein.
Vielleicht wird dir ja durch folgendes Beispiel der Sinn von const etwas klarer
class Bitmap { //... public: const unsigned long* GetBitmap() const { return Buffer; }; unsigned long* GetBitmap() { return Buffer; }; private: unsigned long* Buffer; };