Ich habe ein class A
wie unten erwähnt: -
Ich möchte weder die Elementfunktion erstellen, noch das obige class A
erben noch den Bezeichner von iData
ändern.
Meine Zweifel: -
iData
eines Objekts zugegriffen wird, sagen wir obj1
, was eine Instanz von class A
? iData
eines Objekts obj1
? Hinweis : Verwenden Sie nicht friend
.
Sie können nicht. Dieses Mitglied ist privat und außerhalb der Klasse nicht sichtbar. Das ist der springende Punkt der Modifizierer public / protected / private.
(Sie könnten wahrscheinlich auch schmutzige Pointer-Tricks verwenden, aber ich schätze, dass Sie ziemlich schnell ein undefiniertes Verhaltensgebiet betreten würden.)
BEARBEITEN:
Du hast gerade gesehen, dass du die Frage bearbeitet hast, um zu sagen, dass du keinen Freund benutzen willst.
Dann lautet die Antwort:
NEIN kann man nicht, zumindest nicht auf portable Weise, die vom C ++ - Standard zugelassen wird.
Der spätere Teil der Antwort war vor dem Q edit & amp; Ich überlasse es hier für den Vorteil von & gt; diejenigen, die ein paar Konzepte verstehen & amp; nicht nur eine Antwort auf die & gt; Frage.
Wenn Sie Mitglieder unter einem privaten Zugriffsspezifizierer haben, sind diese Mitglieder nur innerhalb der Klasse zugänglich. Kein Zugriff von außen ist erlaubt.
Ein Quellcode Beispiel:
%Vor% Ein Workaround: friend
zu retten
Um auf das private Mitglied zuzugreifen, können Sie eine Funktion / Klasse als Freund dieser bestimmten Klasse deklarieren, und dann ist das Mitglied innerhalb dieser Funktion oder des Klassenobjekts ohne Zugriffsspezifizierer-Prüfung zugänglich.
Modifiziertes Codebeispiel:
%Vor%Der Blog dieses Kerls zeigt Ihnen, wie man es mit Vorlagen macht. Mit einigen Änderungen können Sie diese Methode anpassen, um auf ein privates Datenmitglied zuzugreifen, obwohl ich es trotz mehr als 10 Jahren Erfahrung schwierig fand.
Ich wollte wie alle anderen darauf hinweisen, dass es äußerst wenige Fälle gibt, in denen dies legitim ist. Ich möchte jedoch darauf hinweisen: Ich habe Komponententests für eine Software-Suite geschrieben. Eine Bundesaufsichtsbehörde verlangt, dass jede einzelne Codezeile ausgeübt und getestet wird, ohne den ursprünglichen Code zu ändern. Aufgrund des schlechten Designs (IMHO) war eine statische Konstante im "privaten" Bereich, aber ich musste sie im Komponententest verwenden. Also schien mir die Methode der beste Weg zu sein.
Ich bin mir sicher, dass der Weg vereinfacht werden könnte, und ich bin mir sicher, dass es andere Wege gibt. Ich poste das nicht für das OP, da es schon 5 Monate her ist, aber hoffentlich wird es für zukünftige Googler nützlich sein.
iData
ist ein private
Mitglied der Klasse. Nun hat das Wort private
eine sehr bestimmte Bedeutung, sowohl in C ++ als auch im wirklichen Leben. Es bedeutet Sie können es nicht berühren . Es ist keine Empfehlung, es ist das Gesetz. Wenn Sie die Klassendeklaration nicht ändern, dürfen Sie dieses Element in keiner Weise, Form oder Form manipulieren.
In C ++ ist fast alles möglich! Wenn Sie keine Möglichkeit haben, private Daten zu erhalten, müssen Sie hacken. Tue es nur zum Testen!
%Vor%Zugriff auf private Mitglieder außerhalb der Klasse .... nur für Studienzwecke .... Dieses Programm akzeptiert alle folgenden Bedingungen Msgstr "Ich möchte keine Elementfunktion für die obige Klasse A erstellen. Außerdem möchte ich die obige Klasse A nicht erben. Ich möchte den Spezifizierer von iData nicht ändern."
// Hier wird Member-Funktion nur verwendet, um die privaten Werte einzugeben und auszugeben ... // void hack () ist außerhalb der Klasse definiert ...
%Vor%Tags und Links class c++ encapsulation private data-members