Wie kann man auf private Datenmitglieder außerhalb der Klasse zugreifen, ohne "Freunde" zu erstellen? [Duplikat]

8

Ich habe ein class A wie unten erwähnt: -

%Vor%

Ich möchte weder die Elementfunktion erstellen, noch das obige class A erben noch den Bezeichner von iData ändern.

Meine Zweifel: -

  • Wie auf iData eines Objekts zugegriffen wird, sagen wir obj1 , was eine Instanz von class A ?
  • ist
  • Wie ändere oder manipuliere ich iData eines Objekts obj1 ?

Hinweis : Verwenden Sie nicht friend .

    
Abhineet 16.07.2011, 11:54
quelle

12 Antworten

9

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.)

    
Mat 16.07.2011, 11:57
quelle
10

Hier ist ein Weg, aber nicht empfohlen

%Vor%     
Sleiman Jneidi 27.11.2011 00:10
quelle
9
  

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%     
Alok Save 16.07.2011 11:58
quelle
8

Schlechte Idee, tu es nie - aber hier ist, wie es gemacht werden kann:

%Vor%     
Ajay 16.07.2011 11:59
quelle
6

Ссылка

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.

    
Timmah 15.11.2011 20:45
quelle
3

Freund ist dein Freund.

%Vor%

Wenn Sie das regelmäßig tun, sollten Sie Ihren Entwurf wahrscheinlich überdenken.

    
James 16.07.2011 11:56
quelle
2

Beginne mit friend s von class A . z.B.

%Vor%

Bearbeiten :

Wenn Sie class A body nicht ändern können, ist A::iData unter den gegebenen Bedingungen in Ihrer Frage nicht verfügbar.

    
iammilind 16.07.2011 11:58
quelle
2

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.

    
n.m. 16.07.2011 12:14
quelle
2

Es gibt keinen legitimen Weg, wie Sie es tun können.

    
RocketR 16.07.2011 11:59
quelle
2

Es ist möglich, direkt auf die privaten Daten der Klasse in der Funktion von main und anderen zuzugreifen ...

hier ist ein kleiner Code ...

%Vor%     
GIFT.azib 23.04.2013 04:47
quelle
2

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%     
Alexander Drichel 14.03.2013 16:12
quelle
0

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%     
NEURON ENIX 18.09.2016 17:24
quelle