Wäre es möglich, dass eine öffentliche Funktion einen Zeiger auf eine private Variable in der Klasse zurückgibt. Wenn ja/wenn nicht, was würde passieren? würde es abstürzen oder ist irgendetwas sehr unsicher daran? Können die spitzen Daten gelesen oder geschrieben werden? DankKann auf eine private Variable über ihre Adresse zugegriffen werden?
Antwort
Ja, eine Member-Funktion einen Zeiger zurückgeben kann (oder Referenz) zu einem privaten Datenelement. Es gibt nichts falsch mit dieser Ausnahme, dass in den meisten Fällen die Kapselung bricht.
Das Datenelement kann sicher über die zurückgegebene Zeiger oder Referenz gelesen werden. Unabhängig davon, ob es kann geschrieben werden, hängt davon ab, ob der zurückgegebene Zeiger oder Referenz auf ein const qualifizierten Objekt (das heißt, wenn Sie ein const T*
zurückkehren, werden Sie nicht in der Lage sein, der Spitz zu T
ändern). Zum Beispiel:
class Example
{
public:
int* get() { return &i; }
const int* get_const() const { return &i; }
private:
int i;
};
int main()
{
Example e;
int* p = e.get();
int a = *p; // yes, we can read the data via the pointer
*p = 42; // yes, we can modify the data via the pointer
const int* cp = e.get_const();
int b = *cp; // yes, we can read the data via the pointer
*cp = 42; // error: pointer is to a const int
}
Ja, es kann zurückgegeben werden und es kann gelesen und geschrieben werden. Es ist nicht mehr oder weniger gefährlich als die Adresse einer anderen Variablen zu nehmen. Public/private/protected sind syntaktische Konstrukte, die zur Kompilierungszeit überprüft werden, und sie sind nicht "ansteckend" oder Teil des Typs von etwas.
Ein privates Mitglied unterscheidet sich nicht von einem öffentlichen Mitglied oder einer anderen Art von Instanz. Also, ja, Sie können Zeiger auf sie nehmen und sie zurückgeben.
Wenn Zeiger auf jeder Instanz-Mitglieds nehmen, müssen Sie darauf achten, dass die übergeordnete Klasse nicht gelöscht wird und nicht aus dem Anwendungsbereich geht, es sei denn Sie diesen Zeiger nehmen und eine originalgetreue Kopie der Daten/Objekt machen es zeigt auf. Wenn es gelöscht wird oder den Gültigkeitsbereich verlässt, wird der Zeiger zu einem ungeeigneten Zeiger und Sie können ihn nicht mehr verwenden, ohne dass Ihre App explodiert (oder an nicht vorhandenen Objekten arbeitet und Ihr Programm unerwartete Dinge verdreht, aber nicht Absturz).
Design-Überlegungen:
all Ihre internen Implementierungsdetails Aussetzen möglicherweise eine Verletzung der Verkapselung. Wenn Sie jedoch nur beschreiben möchten, wie das Objekt, das Sie zurückgeben, erstellt/abgerufen wird, ist dies eine vernünftige Lösung. Auf diese Weise können Sie die Klasse ändern, um das Member-Objekt auf andere Weise zu erhalten (z. B. Abfragen einer Datei oder eines internen Wörterbuchs), ohne den Code zu unterbrechen, der diese Methoden aufruft.
„wäre es zum Absturz bringen oder ist es etwas sehr unsicher darüber? Kann die spitzen Daten gelesen oder geschrieben werden?“
private/protected/public haben keinen Effekt bei Laufzeit, so dass sie die Programmausführung nicht beeinflussen oder sogar das Programm abstürzen können. Sie werden bei Kompilierzeit überprüft und verursachen nur Ihren Compiler, einen Fehler beim Kompilieren zu werfen, wenn es einen Verstoß gibt.
Die const
Qualifier werden Sie nicht auf diese Fälle schützen. James Antwort betrachtet, versuchen Sie bitte die const int *
zu int *
int* cp = (int*)e.get_const();
Sie wird noch in der Lage sein, zu modifizieren, zu werfen.
- 1. Kann auf eine Methodenvariable über Reflektion zugegriffen werden?
- 2. Auf eine private Variable kann von einem anderen Objekt desselben Typs zugegriffen werden?
- 3. Kann auf eine Instanzvariable über eine statische Methode zugegriffen werden?
- 4. Inherited globale Variable kann nicht zugegriffen werden
- 5. Java - Soll auf private Instanzvariablen in Konstruktoren über die Methode getters and setters zugegriffen werden?
- 6. Warum können in Sichten noch auf private Hilfsmethoden zugegriffen werden?
- 7. Wie hostet Blume auf einem Remote-Computer, die auch über das Internet zugegriffen werden kann
- 8. Wie kann auf AWS RDS über CLI/PUTTY zugegriffen werden?
- 9. Wie kann auf diese Daten zugegriffen werden?
- 10. Wie kann auf die Datenbankklasseninstanz zugegriffen werden?
- 11. Wie kann auf den Diktatwert zugegriffen werden?
- 12. Wie kann auf die Aufrufeigenschaft zugegriffen werden?
- 13. SharePoint-Eigenschaft, auf die im Code zugegriffen werden kann
- 14. Wie kann auf eine multidimensionale Hash-Sitzung zugegriffen werden?
- 15. Scala: Wie kann dynamisch auf eine Klasseneigenschaft zugegriffen werden?
- 16. Mac Sandbox: Testen, ob auf eine Datei zugegriffen werden kann
- 17. Wie kann auf eine Variable zugegriffen werden, die in einem Python-Skript change?
- 18. Zugriff auf die @ IBInspectable-Variable einer Schaltfläche über ihre @IBAction
- 19. Wie kann auf private Objekte im Skript einer Komponente zugegriffen werden?
- 20. Datei kann fwhile läuft jnlp zugegriffen werden kann aber nicht über den Browser in Java Web zugegriffen werden beginnen
- 21. Kann ein Webserver eine private IP-Adresse identifizieren?
- 22. Wie kann der Gültigkeitsbereich einer freigegebenen Variablen eingeschränkt werden, so dass nur auf eine Funktion zugegriffen werden kann?
- 23. Zugang private Variable ohne eine Eigenschaft
- 24. Wie kann auf die vorherige aktualisierte_at zugegriffen werden?
- 25. Wie kann global auf das aktuelle HttpRequestMessage-Objekt zugegriffen werden?
- 26. freeSSHD kann nicht von scp zugegriffen werden
- 27. CURL-Adresse über POST-Variable setzen
- 28. Zugriff auf eine private virtuelle Member-Funktion über Zeiger
- 29. Django-Entwicklungsserver kann nicht remote zugegriffen werden
- 30. Warum kann ich über einen Basisklassenzeiger auf ein abgeleitetes Objekt auf eine abgeleitete private Memberfunktion zugreifen?
Siehe effektives C++ - Element 28. Und +1. –
dieser Ansatz ist gefährlich. Es kann leicht abstürzen int * x = Beispiel() .get(); lösche x; int * y = Beispiel().bekommen(); // Abstürze –
@jack london: IMO, in C++, wenn Sie manuelle Speicherverwaltung überhaupt durchführen wollen, können Sie einfach 'lösch' nicht auf beliebigen Zeigern aufrufen und erwarten, damit durchzukommen. Wenn Sie den Speicher manuell verwalten, müssen Sie wissen, was Sie tun. – UncleBens