Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

06.09.2014, 10:32

Const-correctness bei Rückgabe interner Zeiger

Guten Tag zusammen,
ich habe eine kurze Frage bezüglich const-correctness. Ich habe eine Klasse Texture die intern ein Zeiger auf eine LPDIRECT3DTEXTURE9 Resource hat. Außerdem habe ich eine Methode

C-/C++-Quelltext

1
LPDIRECT3DTEXTURE9 getInterface();
die genau diesen Zeiger zurückgibt. Kann ich diese Methode als const deklarieren? Bei Aufruf dieser Methode wird der logische Status des Texture-Objekts nicht verändert, jedoch ist es mit dem zurückgegebenen Pointer sehr leicht möglich den "Inhalt" der Klasse maßgeblich zu verändern.

Viele Grüße

newby

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

06.09.2014, 13:24

Wenn man es genau nimmt, ist "const" mehr ein Hinweis und nicht wirklich strikt. Das ist einer der Gründe warum C# kein const kennt. Also wenn du "const" dran schreibst, muss der Nutzer hoffen, dass auch "const" drinne ist.
Ich persönlich habe lieber einen schwachen Hinweis als garkeine Information.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

3

06.09.2014, 15:17

Es gibt da zwei ARten von const Correctness. Das eine ist die die der Compiler erkennen kann und das andere ein Fall wie dieser hier. Über Referenzen oder Zeiger wird etwas zurück gegeben wodurch der Zustand doch verändert werden kann. Was von beidem du willst ist deine Sache. Wobei ich denke dass es sinnvoll ist nur mit const zu arbeiten wenn das Objekt wirklich konstant ist. Bin aber auch nicht mehr wirklich drin da.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

4

06.09.2014, 21:15

const bedeutet bei Methoden doch, dass sie keine Klassenmember ändern dürfen. Durch den return eines Pointers verändern sie die Klassenmember auch nicht, das macht dann das aufrufende Objekt (vielleicht).
Außerdem hab ich in der API von OGRE Beispiele für Pointer-returner gefunden, die const sind.

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

5

06.09.2014, 21:34

Es ist auch ein Unterschied zwischen einen konstanten Pointer, einem Pointer auf Konstanten und einem konstanten Pointer auf eine Konstante. Vielleicht einfach mal nachlesen.

Hello_Kitty!

unregistriert

6

06.09.2014, 22:31

Das eigentliche Problem ist, dass diese Methode die Kapselung des Objekts aufbricht. Constness kann dann natürlich auch nicht mehr garantiert werden.

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

7

07.09.2014, 00:13

Nein wieso, ein Getter allein bricht schon die Kapselung, das heißt nicht, dass keine constness gewährt ist. Kapselung ist informationsverschluss, nicht zugriffsverschluss.

Hello_Kitty!

unregistriert

8

07.09.2014, 00:43

Es ist genau anders herum, Kapselung ist Zugriffsverschluss auf die interne Objektrepräsentation mit Zugriff auf den logischen Objektzustand / "Information" über ein Interface.

Ein Getter für ein Handle der darunterliegenden API hebelt diesen Mechanismus völlig aus, Getter für z.B. die Maße der Textur aber nicht.

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

9

07.09.2014, 03:30

Doch ein Getter gibt Informationen Preis, impliziert aber nicht, dass du diese auch verändern kannst.

FSA

Community-Fossil

  • Private Nachricht senden

10

07.09.2014, 11:40

Was mich generell wundert: Wieso sollte man einen Zeiger auf ein Interface ändern wollen? Wenn das passiert ist doch ziemlich was schief gelaufen.
Ansonsten mach es doch so:

C-/C++-Quelltext

1
const IDirect3DTexture9* const GetInterface() const {return _interface;}

Da kann nichts mehr schiefgehen.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Werbeanzeige