JGU Logo JGU Logo JGU Logo JGU Logo

Institut für Informatik

Michael Wand
Christian Ali Mehmeti-Göpel
Wintersemester 2020/21DIGITAL

Blatt 06

Aufgabe 01
Einführung in die Softwareentwicklung



Aufgabe Includes

Letzte Änderung: 14. December 2020, 13:34 Uhr
10 Punkteim Detail
Ansicht:   |  


  1. Im folgenden Beispiel schlägt die Kompilierung von main.cpp fehl.
    1. Erklären Sie, wo das Problem liegt.
    2. Nutzen Sie Include-Guards (Vorlesung C08 - Modularisierung) so, dass das Problem nicht mehr auftritt.
    Codeschnipsel
    Datei struct_a.h
    #include <iostream>
    #include "struct_b.h"
    
    struct struct_a {
        struct_b b;
        struct_a(struct_b _b) : b(_b) {}
        void print() {
            std::cout << "B=";
            b.print();
        }
    };
    


    Datei struct_b.h
    #include <iostream>
    
    struct struct_b {
        int32_t val;
        struct_b(int _val) : val(_val) {}
        void print() {
            std::cout << "{val = " << val << "}";
        }
    };
    


    Datei main.cpp
    #include "struct_a.h"
    #include "struct_b.h"
    #include <iostream>
    
    int main() {
        struct_b b(42);
        struct_a a(b);
        b.print();
        std::cout << "\n";
        a.print();
        return 0;
    }
    


  2. Wir haben nun einen neuen Fall, in dem zwei Klassen die jeweils andere speichern müssten. Der Code kompiliert nicht, dieses mal erscheint jedoch eine andere Fehlermeldung. Erklären Sie wo das Problem liegt.

    Codeschnipsel
    Datei left.h
    #include "right.h"
    
    struct left {
        right right;
        left(right _right) : right(_right) {}
    };
    


    Datei right.h
    #include "left.h"
    
    struct right {
        left left;
        right(left _left) : left(_left) {}
    };
    


    Datei main.cpp
    #include "left.h"
    #include "right.h"
    #include <iostream>
    
    int main() {
    }
    


  3. Das Problem aus Codebeispiel 2 lässt sich mit Pointern lösen, dazu sind jedoch sogenannte forward declarations nötig. Diese zeigen dem Compiler an, dass eine Klasse später unter einem bestimmten Name deklariert wird, umfassen aber nicht die eigentliche Deklaration. Im Codebeispiel unten wird eine forward declaration für car benutzt. Ohne diese Deklaration wüsste der Compiler nicht, dass es sich bei car* um einen gültigen (Pointer-)Datentypen handelt, und würde einen Typfehler melden.
    class car;     // forward declaration
    
    class wheel {
        car* _car;
    };
    


    Direkt im nächsten Versuch probieren wir also eine Lösung mit Pointern aus. Dummerweise kompiliert der Code trotzdem nicht.
    Lösen Sie den Fehler mithilfe der hier erklärten forward declarations im Header.
    Codeschnipsel
    Datei left.h
    #include "right.h"
    
    struct left {
        right *right;
        left(right *_right) : right(_right) {}
    };
    


    Datei right.h
    #include "left.h"
    
    struct right {
        left *left;
        right(left *_left) : left(_left) {}
    };
    


    Datei main.cpp
    #include "left.h"
    #include <iostream>
    
    int main() {
    }