Hallo,
ich habe folgenden Code gegeben, der die Klassen Bruch und Bruchkopie
beschreibt:
1 | #include<string>
|
2 | #include<memory>
|
3 | #include <iostream>
|
4 |
|
5 | class Bruch {
|
6 | public:
|
7 | // Kopierkonstruktor
|
8 | Bruch(const Bruch& b) : m_zaehler{ b.m_zaehler }, m_nenner{ b.m_nenner } { }
|
9 | Bruch() : m_zaehler{ 2 }, m_nenner{ 99 } { }
|
10 | Bruch(int z, int n) : m_zaehler{ z }, m_nenner{ n } { }
|
11 | int m_zaehler;
|
12 | int m_nenner;
|
13 | };
|
14 |
|
15 | class BruchKopie {
|
16 | public:
|
17 | Bruch* m_bruch;
|
18 | BruchKopie(const Bruch& b) : m_bruch{ new Bruch{ b } } { }
|
19 | ~BruchKopie() {
|
20 | delete m_bruch;
|
21 | }
|
22 | };
|
23 |
|
24 | int main() {
|
25 | Bruch b1{ 2, 5 };
|
26 | b1.m_zaehler = 123;
|
27 | std::cout << b1.m_zaehler << std::endl;
|
28 |
|
29 | BruchKopie b5{ b1 };
|
30 |
|
31 | // hier weitere Anweisungen
|
32 | }
|
Warum funktionieren folgende Anweisungen?
1 | std::cout << (b5.m_bruch)->m_zaehler << std::endl;
|
2 | std::cout << b5.m_bruch->m_zaehler << std::endl;
|
3 | (b5.m_bruch)->m_zaehler = 77;
|
4 | std::cout << (*b5.m_bruch).m_zaehler << std::endl;
|
b5 ist ein Objekt der Klasse Bruchobjekt und besitzt ein Klassenelement
namens m_bruch, das einen Zeiger auf eine Bruchklasse beinhaltet.
Daher hätte ich erwartet, daß dieses Klassenelement dereferenziert
werden muß?
1 | std::cout << (b5.*m_bruch).m_zaehler;
|
2 | std::cout << b5.(*m_bruch).m_zaehler;
|
3 | std::cout << b5.*m_bruch.m_zaehler;
|
Die Anweisungen funktionieren aber nicht (in meiner Verzweiflung habe
ich alle möglichen Kombinationen durchprobiert, Sternchen hier,
Sternchen da, bis ich auf etwas funktionierendes traf. Besonders
zielführend scheint mir das nicht zu sein :-)