Zugriff auf Objekte in ineinander verschachtelten Klassen
-
Hallo,
habe das Problem, dass ich auf Objekte in ineinander verschachtelten Klassen zugreifen muss.
Ich muss über a_class auf ii in c_class zugreifen, siehe Quellcode.
Wie funktioniert das?(Das Problem ergibt sich bei meinem gsoap-Client, ich kann nicht einfach "c_class" ansteuern, sondern muss über "a_class")
Vielen Dank für Eure Hilfe
test_classes_.h:
class a_class; class b_class; class c_class; class a_class { public: a_class(); ~a_class(); b_class* b_obj; }; class b_class { public: b_class(); ~b_class(); c_class* c_obj; }; class c_class { public: c_class(); ~c_class(); int ii; };test_classes_.cpp:
1 #include "test_classes_.h" 2 #include <iostream> 3 using namespace std; 4 5 int main() 6 { 7 int erg; 8 a_class a; 9 //b_class b; 10 //c_class c; 11 12 //variable in c_class setzen 13 a->b_obj->c_obj.ii = 1; 14 15 //variable in c_class auslesen 16 erg = a->b_obj->c_obj.ii; 17 18 std::cout<<"erg von ii = "<< erg <<std::endl; 19 20 return 0; 21 }Fehlermeldung:
test_classes_.cpp: In function »int main()«:
test_classes_.cpp:13: Fehler: Basisoperand von »->« hat Nicht-Zeiger-Typ »a_class«
test_classes_.cpp:16: Fehler: Basisoperand von »->« hat Nicht-Zeiger-Typ »a_class«
-
c++user_xy_ schrieb:
a->b_obj->c_obj.ii = 1; erg = a->b_obj->c_obj.ii;Probier stattdessen mal:
a.b_obj->c_obj->ii = 1; erg = a.b_obj->c_obj->ii;Beachte: "a->" wurde durch "a." ersetzt und "c_obj." durch "c_obj->"
Gruß,
SP
-
Hallo SP,
mit deiner Lösung erhalte ich:/tmp/cchAq2wb.o: In function
\_\_static\_initialization\_and\_destruction_0(int, int)': test\_classes\_.cpp:(.text+0x1d): undefined reference tostd::ios_base::Init::Init()'
test_classes_.cpp:(.text+0x22): undefined reference tostd::ios_base::Init::~Init()' /tmp/cchAq2wb.o: In functionmain':
test_classes_.cpp:(.text+0x76): undefined reference toa\_class::a\_class()' test\_classes\_.cpp:(.text+0x9a): undefined reference tostd::cout'
test_classes_.cpp:(.text+0x9f): undefined reference tostd::basic\_ostream<char, std::char\_traits<char> >& std::operator<< <std::char\_traits<char> >(std::basic\_ostream<char, std::char_traits<char> >&, char const*)' test\_classes\_.cpp:(.text+0xb0): undefined reference tostd::basic_ostream<char, std::char_traits<char> >::operator<<(int)'
test_classes_.cpp:(.text+0xb8): undefined reference tostd::basic\_ostream<char, std::char\_traits<char> >& std::endl<char, std::char\_traits<char> >(std::basic\_ostream<char, std::char_traits<char> >&)' test\_classes\_.cpp:(.text+0xc0): undefined reference tostd::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))'
test_classes_.cpp:(.text+0xd0): undefined reference toa\_class::~a\_class()' test\_classes\_.cpp:(.text+0xf0): undefined reference toa_class::~a_class()'
/tmp/cchAq2wb.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'
collect2: ld gab 1 als Ende-Status zurück
-
Du bist wenigstens einen Schritt weiter. Der Compiler übersetzt den Code. Dem Linker fehlen die Definitionen der Konstruktoren und Destruktoren, die Du vergessen hast, anzugeben. Du hast sie ja nur deklariert.
Gruß,
SP
-
Auf was sollen denn die Zeiger initialisiert werden? Du musst sie irgendwie initialisieren (zB im Konstruktor), sonst darfst Du sie nicht dereferenzieren.
Gruß,
SP
-
Herzlichen Dank für Deine Unterstützung.
In meinen gsoap-stub-classes hab ich keine Konstruktoren.
Wenn ich die Konstruktoren in dem Quellcode, den ich gepostet habe, weglasse, erscheint die gleiche Fehlermeldung. Hmm was ist zu tun?
-
c++user_xy_ schrieb:
Hmm was ist zu tun?
1. C++ lernen
2. Deklarationen der "ctors" und "dtors" entfernen oder eine Definition der ctors und dtors hinzugüfen, zB in Deiner test_classes_.cpp.Gruß,
SP
-
Sebastian Pizer schrieb:
Dem Linker fehlen die Definitionen der Konstruktoren und Destruktoren, die Du vergessen hast, anzugeben.
Dem Linker fehlt noch einiges mehr.
Hast Du vielleicht versucht, das Programm mit gcc statt g++ zu linken?
-
@LordJaxom:
stimmt hatte gcc statt g++ verwendet.
-
Vielen Dank Leute. Das Problem hat sich erledigt.
So klappts:#include "test_classes_.h"
#include <iostream>
#include <string>
#include <sstream>
using namespace std;/*
* Konstruktor
*/
a_class::a_class()
{
a_class::b_obj = new b_class;
}
a_class::~a_class()
{
}b_class::b_class()
{
b_class::c_obj = new c_class;
}
b_class::~b_class()
{
}c_class::c_class()
{
c_class::ii=0;
}
c_class::~c_class()
{
}/*
* Main
*/
int main()
{
int erg;
string str_erg;
stringstream stream_erg;a_class* a = new a_class;
b_class* b = new b_class;
c_class c;/*
* ii setzen
*/
a->b_obj->c_obj->ii = 1;/*
* ii auslesen
*/
erg = a->b_obj->c_obj->ii;/*
* Ausgabe
*/
stream_erg << erg;
str_erg = stream_erg.str();
std::cout << "erg von ii = " << str_erg.c_str() <<std::endl;return 0;
}
-
habe nun ein weiteres Problem.
wie muss der Zugriff aussehen, wenn in der header-Datei
die Klasse b_class ein Member vom Typ Zeiger auf Zeiger (**) enthält?Zugriff in test_classes_.cpp:
erg = a->b_obj->c_obj->ii;test_classes_.h:
class b_class { public: b_class(); ~b_class(); c_class* *c_obj; };
-
Fehlermeldung:
test_classes_.cpp: In constructor »b_class::b_class()«:
test_classes_.cpp:20: Fehler: »c_class*« kann nicht nach »c_class**« in assignment umgewandelt werden
test_classes_.cpp: In function »int main()«:
test_classes_.cpp:52: Fehler: Abfrage des Elementes »ii« in »* a->a_class::b_obj->b_class::c_obj«, das vom Nicht-Klassentyp »c_class*« ist
test_classes_.cpp:57: Fehler: Abfrage des Elementes »ii« in »* a->a_class::b_obj->b_class::c_obj«, das vom Nicht-Klassentyp »c_class*« ist