Zeiger auf private Klassenelemente als Rückgabewert?
-
Ich habe zwei Klassen:
class Objekt{ VERTEX* Punkte; unsigned Anzahl; public: VERTEX* getPunkte(); // Ist das klug? Die Bildschirmklasse benötigt aber // AUSNAHMSWEISE Zugriff auf den Speicherbereich der Punkte, um sie in // einen Vertexbuffer speichern zu können unsigned getAnzahl(); }; class Bildschirm{ Objekt* MehrereObjekte; unsigned Anzahl; public: bool ObjektEinfuegen(Objekt& Ein_Objekt){ /* BLA BLA, irgendwann ist dann das hier notwendig: 'Kopiere die Punkte von Ein_Objekt in den Vertexbuffer, also: */ memcpy(temporaererVoidBuffer, Ein_Objekt.getPunkte(), /* Liefert ja den Zeiger! */ Ein_Objekt.getAnzahl() * sizeof (VERTEX)); };Eigentlich sollte man ja keine Zeiger auf interne Daten zurückliefern, das führt ja das Konzept des 'Daten versteckens' sonst ad absurdum.
Wie kann ich sicher stellen, dass der Aufrufer, wenn er den Zeiger erst einmal von der Funktion zurückgeliefert bekommen hat, damit keinen Unfug anstellen kann (s.h. nicht meine internen Daten schreibend manipulieren kann?)Ist es klüger, die getPunkte() Funktion private zu machen und der Klasse Bildschirm mittels friend Deklaration ausnahmsweise zu gestatten, die Funktion aufzurufen?
Danke für Tipps!
-
Hallo
Du kannst die Rausgabe auch in public-Bereich regulieren, einfach mal zum Thema Const-Correctness informieren.
const VERTEX* getPunkte() const;bis bald
akari
-
Wenn ich
{cpp]
const XYZCOLOR* getPoint();
[/cpp]bin ich mir bezüglich des Typs des Rückgabewertes nicht sicher.
Wird dabei ein Zeiger auf ein konstantes XYZCOLOR Objekt zurückgegeben, oder wird ein konstanter Zeiger auf irgend ein XYZCOLOR Obkekt retourniert. Das ist ziemlich wichtig weil normalerweise nehm ich's mit der const-Correctness nicht so ernst, nur diesmal ist das Projekt sehr groß und ich muss sie befolgen. Eigentlich eine 50/50 Chance, was jetzt richtig ist:
konstanter Zeiger auf ein Variables Objekt oder variabler Zeiger auf ein Konstantes Objekt?
(btw. mir scheint es ist unvermeidbar, den Aufrufer grundlegend daran zu hindern, mit dem retournierten Zeiger Unfug zu treiben? Oder gibt's da ein Sprachmittel in C++ dagegen?)
-
Schneee schrieb:
Wenn ich
const XYZCOLOR* getPoint();bin ich mir bezüglich des Typs des Rückgabewertes nicht sicher.
Wird dabei ein Zeiger auf ein konstantes XYZCOLOR Objekt zurückgegeben, oder wird ein konstanter Zeiger auf irgend ein XYZCOLOR Obkekt retourniert.
Du kriegst einen variablen Zeiger auf ein konstantes Objekt zurück.
Siehe auch hier:
int j = 578; int *p = &j; //Variabler Zeiger, variables Objekt const int *p2 = &j; //Variabler Zeiger, konstantes Objekt //int const *p2 = &j; //ebenso: Variabler Zeiger, konstantes Objekt int * const p3 = &j; //Konstanter Zeiger, variables Objekt const int * const p4 = &j; //Konstanter Zeiger, konstantes Objektconst-correctness sollte man im Übrigen immer eine große Bedeutung zukommen lassen.
MfG
GPC
-
Das heißt der Aufrufer müsste den Zeiger auf das konstante Objekt zumindest explizit in einen Zeiger auf ein variables Objekt casten, um Unfug damit zu treiben? Das reicht mir:) Besten Dank!