2010-11-24 9 views
1

Ich habe eine Klasse namens class Car, die als das Objekt Car car1 instanziiert werden muss. Einer der Membervariablen von Auto ist Car::width, aber wenn ich versuche, die LinieWarum kann mein Objekt nicht auf seine eigene private Mitgliedsvariable zugreifen? [C++]

cout << car1.width << endl; 

von main() ich höre auszuführen, dass dies nicht möglich ist, weil Car::width privat ist. Es war mein Verständnis, dass private Mitglieder durch die Objekte der Klasse, zu der sie gehören, zugänglich sind, aber diese Situation hat mich völlig ratlos gemacht. Wie sieht es mit privaten Mitgliedern aus, die Zugriff auf ihre eigenen Objekte haben?

+0

Welche Funktion hat diese Anweisung? Das macht den Unterschied, ob der Zugriff "vom Objekt" ist. – aschepler

+1

Wenn main() der Name einer Funktion von 'Car' ist, verstehe ich nicht, warum Sie meinen, dass der Versuch, auf die width-Variable zuzugreifen, in der Anweisung "... auf private Mitglieder durch das Objekt der Klasse zugegriffen werden kann zu dem sie gehören. " –

Antwort

4

Private Mitglieder sind über die Methoden derselben Klasse zugänglich, zu der sie gehören.

+0

IMHO, * Methode * ist zu zweideutig ein Begriff in C++ verwendet werden. Normalerweise ist eine "Methode" das, was ein Objekt als Antwort auf eine "Nachricht" ausführt, die an es gesendet wird. In C implementieren Sie "Methoden" mit Funktionen, die an einer Struktur arbeiten, die das Objekt darstellt. In C++ können Sie Operatoren so überschreiben, dass die Nachricht "<<" von einer Memberfunktion oder einer Nichtmitgliedsfunktion implementiert werden könnte. Somit kann entweder die "Methode" für diese Nachricht betrachtet werden. Nur Mitgliederfunktionen und Freunde haben den Zugriff, den Sie beanspruchen, Methoden haben. Ich würde sagen, Ihre Antwort ist mehrdeutig und möglicherweise falsch. –

+1

"Methode" ist das übliche C++ - Jargon für "Elementfunktionen".Auch in C++ faq wird dies stark verwendet, zum Beispiel: http://www.parashift.com/c++faq-lite/classes-and-objects.html#faq-7.7 – zvrba

1

Car kann auf width zugreifen. Aber in Ihrem Beispiel ist es Sie wer versucht, auf width zuzugreifen. Dies ist genau die Bedeutung von private.

0

Es kann von innerhalb einer Mitgliedsfunktion zugegriffen werden, nicht außerhalb wie Sie es hier haben. Der ganze Sinn einer privaten Variablen besteht darin, genau das zu verhindern, was Sie versuchen zu tun, nämlich die Benutzer der Klasse nicht die Mitgliedsvariable zu verwenden.

0

Eine Methode in der Klasse Auto kann auf das width Mitglied zugreifen, aber Ihr Code (der, der die cout tut) kann nicht.

1

Wenn die zugreifende Funktion (main in diesem Fall) kein Mitglied ist oder friend Ihre Klasse Car, dann ist der Compiler korrekt zu sagen, dass private Mitglied width ist tabu in diesem Zusammenhang.

Wenn Sie darüber nachdenken, wenn jemand, der einen Car erstellen könnte auf seine private Mitglieder zugreifen würde, würde die Privatsphäre nicht viel bedeuten. Sie machen den Konstruktor public, um die Erstellung des Objekts zuzulassen, aber die Datenelemente des erstellten Objekts vor solchen Benutzern zu verbergen, um sie ordnungsgemäß einzukapseln. Sie beschränken die Handhabung der Interna der Klasse private auf die zulässigen Werte für die Klassenmitglieder public oder protected.

-1
cout << car1.width 

Dies ist nicht car1 versucht, width zu bekommen - es ist cout versucht, width zu bekommen. cout ist kein Mitglied von car1, also width ist privat, es schlägt fehl.

+1

Irreführend. 'Cout' hat damit nichts zu tun. Nur die aktuelle Funktionsdefinition ist wichtig. Dieselbe Aussage ist zulässig, wenn sie in "Car :: print()" erscheint. – aschepler

+0

@aschelper: vielleicht hast du den Teil über diesen Code verpasst, der von 'main()' ausgeführt wurde? –

+2

keine Wenns darüber, du liegst falsch. Ihre Antwort behauptet, "es ist cout versuchen, Breite zu bekommen", und das ist einfach nur falsch. Vielleicht meinst du das nicht, aber es ist das, was du gesagt hast. aschepler korrigiert Sie richtig. –

Verwandte Themen