[DevC++] Zugriff auf private Member
-
Also eigendlich wollte ich mir ne verkettete Liste schreiben, leider scheitert es daran, das ich über nen Pointer keinen zugriff auf Private elemente bekomme...
Kurzes Beispiel:
#include <iostream> #include <stdlib.h> using namespace std; class foo { int a; }; class bar { foo *foobar; public: bar () { foobar = new foo; } ~bar () { delete foobar; } }; int main() { bar * temp; temp = new bar; temp->foobar->a = 10; cout << temp->foobar->a; system("PAUSE"); return 0; }
Fehlermeldungen:
C:\Programme\Dev-Cpp\main.cpp [Warning] In function `int main()': 13 C:\Programme\Dev-Cpp\main.cpp `foo*bar::foobar' is private 23 C:\Programme\Dev-Cpp\main.cpp within this context 13 C:\Programme\Dev-Cpp\main.cpp `foo*bar::foobar' is private 24 C:\Programme\Dev-Cpp\main.cpp within this context C:\Programme\Dev-Cpp\Makefile.win [Build Error] [main.o] Error 1
Bin ich diese woche einfach zu dumm mit C++ umzugehen, oder gibs ne Kompilereinstellung die solche zugriffe verhindert?? (hab scho wie blöd gegooglt und forum durchsucht aber nix passendes gefunden)
PS: Ich habs hier reingestellt, weil ich ne compilereinstellung vermute. Andernfalls bitte verschieben und meinen fehler entschuldigen
-
Der Default bei Klassen ist private. Und da liegt auch dein Problem. Du kannst außerhalb der Klasse bar nicht auf foobar zugreifen. Auch innerhalb von bar kannst du nicht auf foo::a zugreifen, da hier das gleiche Problem vorliegt, nämlich das die Variablen private sind.
-
Das ist mir alles bekannt!
Aber ich bin der festen überzeugung mittels Pointer auch auf private objekte zugreifen zu können und bin mir auch sehr sichwer das schonmal in ner anderen Liste gemacht zu haben.Es währe mir völlig neu, das ich in ner verketteten Liste zum ändern der Zeiger aufs nächste/vorige Objekt
a) die Zeiger public oder
b) memberfunbktionen (public)n zum ändern der Zeiger implementieren muss!Nachtrag
--------
Ich hab jetzt mal folgendes gemacht (Auf hinweis eines Tutorials):#include <iostream> #include <stdlib.h> using namespace std; class foo { protected: int a; }; class bar { protected: friend foo *foobar; public: bar () { foobar = new foo; } ~bar () { delete foobar; } }; int main() { friend bar temp; // temp = new bar; temp.foobar->a = 10; cout << temp.foobar->a; // delete temp; system("PAUSE"); return 0; }
Ergebnis:
15 C:\Programme\Dev-Cpp\main.cpp
foobar' is neither function nor member function; cannot be C:\\Programme\\Dev-Cpp\\main.cpp [Warning] In function
int main()':
23 C:\Programme\Dev-Cpp\main.cpp
temp' declared as a friend 15 C:\\Programme\\Dev-Cpp\\main.cpp
foobar::foobar' is protected
25 C:\Programme\Dev-Cpp\main.cpp
within this context
15 C:\Programme\Dev-Cpp\main.cpp
`foobar::foobar' is protected
26 C:\Programme\Dev-Cpp\main.cpp
within this context
C:\Programme\Dev-Cpp\Makefile.win
[Build Error] [main.o] Error 1
-
THE_FreaK schrieb:
Es währe mir völlig neu, das ich in ner verketteten Liste zum ändern der Zeiger aufs nächste/vorige Objekt
a) die Zeiger public oder
b) memberfunbktionen (public)n zum ändern der Zeiger implementieren muss!So ist es aber. private ist nunmal private und da kannst du von aussen nicht zugreifen. Ich sehe drei Möglichkeiten
1. du machst foo::a public
2. du sagst foo, dass bar ein Freund ist
3. (imo am elegantesten) du machst foo zu einer private nested class von bar mit public Member (nur wenn foo eine Art POD ist) bzw. Memberfunktionen