Problem mit Referenz/Zeiger
-
Ich habe folgenden getter gegeben, mit dem ich arbeiten muss und nicht modifizieren darf.
const ContentMask& getContentMask() const { return *m_contentMask; }Mit diesem getter muss ich dann auf ein Objekt ContentMask zugreifen und diesem Objekt mittels eines setters einen neuen Wert setzen:
tile->getHeader().getContentMask().setHasList(TRUE);Erhalte aber hierbei diese Fehlermeldung:
this-Zeiger kann nicht von 'const ContentMask' in 'ContentMask &' konvertiert werdenDann habe ich als nächstes einen Zeiger hergenommen, da ich von dem oberen getter ja eine Referenz erhalte:
ContentMask* mask = tile->getHeader().getContentMask(); mask->setHasList(TRUE);Aber hier gibt es auch wieder eine Fehlermeldung:
const ContentMask' kann nicht in 'ContentMask *' konvertiert werdenWie kann ich jetzt auf den setter zugreifen? Es muss ja irgendwie eine Möglichkeit geben...
Danke schon mal im Voraus, Bernd
-
Bitte erstmal C++ lernen. Du kannst bei einem konstanten Objekt auch nur const Funktionen aufrufen. Und du solltest es nur ein andere konstante Typen casten. f'`8k
AutocogitoGruß, TGGC (Was Gamestar sagt...)
-
Bernd88 schrieb:
Es muss ja irgendwie eine Möglichkeit geben...
Wieso? const heißt konstant, oder "ich kann nicht verändert werden". Wenn die Methode eine const-Referenz zurückgibt, dann tut sie das in dem Wissen, dass niemand über diese Referenz das Objekt verändert.
Wenn du trotzdem unbedingt das const weghaben willst, kannst du es wegcasten:
ContentMask& contentMask = const_cast<ContentMask&>(tile->getHeader().getContentMask());
contentMask.setHasList(TRUE);Dann kann es aber gut sein, dass dir das Programm um die Ohren fliegt oder du wegen groben Unfugs die Kündigung bekommst.
-
Dem Code nach zu urteilen, den du gepostet hast, wird das, was du willst nicht gehen:
Das Problem ist, dass die
getContentMask-Methode eineconst-Referenz auf deineContentMaskzurückgibt, was bedeutet, dass sie sich über die erhaltene Referenz nicht verändern lässt. Die MethodesetHasListverändert aber (dem Namen und der Fehlermeldung nach) die Instanz auf der sie arbeitet -> Problem.Du könntest gucken, ob es in der Klasse, deren Getter du verwendest noch andere Methoden gibt, die das können, was du möchtest.
Im schlimmsten Fall könntest du auf
const_castzurückgreifen, davor würde ich aber alle anderen Möglichkeiten ausschließen, weil das eher auf einen Designfehler hinweist (die Frage ist, ob der in deinem Code oder in der Klasse, die du verwenden musst liegt).Felix
-
Danke euch für die Antworten!
Mir war schon soweit bewusst, dass es nicht geht. Aber es machte keinen Sinn für mich, da sich ein Objekt aus vielen kleinen Objekten zusammensetzt und diese sich zur Laufzeit ständig in ihrem Verhalten ändern können. Nun gut, das const_cast<> ist eine Übergangslösung.Merci, Bernd
-
Hi 3 Bemerkungen von mir:
1.)
Bernd88 schrieb:
...da sich ein Objekt aus vielen kleinen Objekten zusammensetzt und diese sich zur Laufzeit ständig in ihrem Verhalten ändern können....
Dann ist das Objekt eben doch nicht konstant und die Schnittstelle stimmt nicht.
2.) Man kann Attribute
mutabledeklarieren. Das bedeutet dann "Ich kümmere mich selbst um die fachliche Konstanz". Das kann aber (absolut zu Recht) nur der Programmierer der Klasse.Bernd88 schrieb:
..Ich habe folgenden getter gegeben, mit dem ich arbeiten muss und nicht modifizieren darf. ...
3.) Ich sehe nicht, inwieweit ein const_cast<> "erlaubter" sein soll als eine Veränderung der Schnittstelle.
Wenn man die Schnittstelle nicht verändern darf, dann entweder zu Übungszwecken oder weil Andere sich auf diese Schnittstelle verlassen - insbesonders die Implementierer vongetContentMask().Insgesamt scheinst Du (absichtlich?mutwillig?) das Wesentliche der Antworten auszublenden:
Phoemuex schrieb:
...
Im schlimmsten Fall könntest du aufconst_castzurückgreifen, davor würde ich aber alle anderen Möglichkeiten ausschließen, ...Bashar schrieb:
...
Wenn du trotzdem unbedingt das const weghaben willst, kannst du es wegcasten:
...
Dann kann es aber gut sein, dass dir das Programm um die Ohren fliegt oder du wegen groben Unfugs die Kündigung bekommst.Schonmal überlegt, was passiert, wenn
getContentMask()z.B. einen Zeiger auf ein Literal zurückgibt (ist ja OK, weil const&)? Vielleicht sogar erst in der nächsten Version?Letztlich steht es Dir natürlich frei, zu tun, was Du willst ... ich persönlich würde aber nicht nur Experten fragen, sondern mir auch ihre Antworten anhören.
Gruß,
Simon2.