DIGITAL
#included man also Code, sofern sich dieser in einer anderen Datei befindet. In dieser Aufgabe schauen wir uns an, welche Probleme dabei entstehen können und wie man diese Lösen kann.
main.cpp abzuändern, sodass das Problem nicht mehr auftauchen würde, nämlich indem man die Zeile #2, #include "B.h" aus der main.cpp entfernt. Verifizieren Sie zuerst, dass diese Änderung eine Kompillierung des ursprünglichen Codes ermöglicht. A.h#include "<iostream>"
#include "B.h"
struct A {
B b;
A(B _b) : b(_b) {}
void print() {
std::cout << "B=";
b.print();
}
};
B.h#include <iostream>
struct B {
int val;
B(int _val) : val(_val) {}
void print() {
std::cout << "{val = " << val << "}";
}
};
main.cpp#include "A.h"
#include "B.h"
#include <iostream>
int main() {
B b(42);
A a(b);
b.print();
std::cout << "\n";
a.print();
return 0;
}
left.h#include "right.h"
struct Left {
Right right;
Left(Right _right) : right(_right) {}
};
right.h#include "left.h"
struct Right {
Left left;
Right(Left _left) : left(_left) {}
};
main.cpp#include "left.h"
#include "right.h"
#include <iostream>
int main() {
}
Car) später definiert wird und stellen nur sicher, dass der Compiler weiß, dass dieses Objekt existiert (wir müssen nur sicherstellen, dass die Klasse später genauer definiert wird). Der Nachteil hierbei ist, dass wir bis die Klasse genauer definiert wird, auf keine Details (Member, Speichergröße) zurückgreifen dürfen. Reine Pointer sind jedoch vollkommen okay, da der Speicher dafür stets durch size_t gegeben ist. Die Syntax dafür sieht folgendermaßen aus: class Car; // forward declaration
class Wheel {
Car* car;
};
left.h#include "right.h"
struct Left {
Right *right;
Left(Right *_right) : right(_right) {}
};
right.h#include "left.h"
struct Right {
Left *left;
Right(Left *_left) : left(_left) {}
};
main.cpp#include "left.h"
#include <iostream>
int main() {
}