Zugriff auf Objekte in ineinander verschachtelten Klassen



  • 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 to std::ios_base::Init::~Init()' /tmp/cchAq2wb.o: In functionmain':
    test_classes_.cpp:(.text+0x76): undefined reference to a\_class::a\_class()' test\_classes\_.cpp:(.text+0x9a): undefined reference tostd::cout'
    test_classes_.cpp:(.text+0x9f): undefined reference to std::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 to std::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 to a\_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


Anmelden zum Antworten