Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
TigerClaw25
unregistriert
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 |
// C++ für Spieleprogrammierer // Listing 11.12 // Friend-Klassen // #include <iostream> using namespace std; // Klassen // // Klasse für den Tank eines Raumschiffs // class CTank { // Die Klasse CAntrieb hat Zugriffsrechte auf // die privaten Klassenelemente friend class CAntrieb; public: CTank (int MaxTreibstoff); ~CTank (); private: int m_Treibstoffmenge; }; // Konstruktor // CTank::CTank (int MaxTreibstoff) { cout << "Neue Tank-Instanz erstellt" << endl; // Treibstoffmenge festlegen m_Treibstoffmenge = MaxTreibstoff; } // Konstruktor // Destruktor // CTank::~CTank () { cout << "Tank-Instanz freigegeben" << endl; } // Klasse für einen Antrieb // class CAntrieb { public: CAntrieb (int Verbrauch); ~CAntrieb (); void MontiereTank (CTank *pTank); void Schub (); private: CTank *m_pTank; int m_Verbrauch; }; // Konstruktor // CAntrieb::CAntrieb (int Verbrauch) { cout << "Neuer Antrieb erstellt" << endl; // Verbrauch festlegen m_Verbrauch = Verbrauch; } // Konstruktor // Destruktor // CAntrieb::~CAntrieb () { // Montierten Tank entfernen if (m_pTank != NULL) { delete (m_pTank); m_pTank = NULL; } cout << "Antrieb freigegeben" << endl; } // Destruktor // MontiereTank // void CAntrieb::MontiereTank (CTank *pTank) { // Zeiger auf übergebenen Tank kopieren m_pTank = pTank; cout << "Tank montiert" << endl; } // MontiereTank // Schub // void CAntrieb::Schub () { // Reicht der verbleibende Treibstoff noch? if (m_pTank->m_Treibstoffmenge - m_Verbrauch < 0) { // Nein, also kein Schub mehr möglich cout << "Tank ist leer!" << endl; } else { // Der Treibstoff reicht noch, also Menge abziehen cout << "Antrieb gibt Schub" << endl; m_pTank->m_Treibstoffmenge -= m_Verbrauch; } } // Schub // Hauptprogramm // int main () { // Instanzen für Tank und Antrieb CAntrieb *pAntrieb; CTank *pTank; // Neuen Tank mit 170 Einheiten Treibstoff erstellen pTank = new CTank (170); // Neuen Antrieb mit Verbrauch von 35 Einheiten // Treibstoff erstellen pAntrieb = new CAntrieb (35); // Den Tank an den Antrieb montieren pAntrieb->MontiereTank (pTank); // Antrieb gibt mehrmals Schub for (int i=0; i<5; i++) { pAntrieb->Schub (); } // Antrieb freigeben. Die Tank-Instanz muss (darf) // nicht freigegeben werden, da dies im Destruktor // der Antriebsklasse geschieht // if (pAntrieb != NULL) { delete (pAntrieb); pAntrieb = NULL; } system("Pause"); return (0); } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
// Konstruktor // CWerft::CWerft (string sName) { cout << "Neue Schiffswerft erstellt" << endl; // Name merken m_sName = sName; // Neuen Jäger erstellen und diesen zum // eigenen Schutz andocken lassen m_pBewacher = new CJaeger (); m_pBewacher->Andocken (this); } // Konstruktor // Hauptprogramm // int main () { CWerft ("Werft 01"); return (0); } |
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Don't. Ganz ehrlich, fang nicht an mit friend herumzudocktern als sei ein übliches Hilfsmittel. Ist es nicht. Friend sollte sehr selten und am besten gar nicht eingesetzt werden, wenn du mich fragst. Das führt nur zu vernetzten Klassen statt zu einer sauberen Trennung von Funktionalität.Meine Frage ist, wie man bei der Erstellung solcher Klassen vorgeht?
TigerClaw25
unregistriert
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
TigerClaw25
unregistriert
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
TigerClaw25
unregistriert
Bin schon dabei. Was ich als Anfänger aber schwierig finde, ist die Vorgehensweise. Man hat zwar den kompletten Code aber in der Realität würde ich eventuell ein Fenster erzeugen und danach erst eine klasse Framework erstellen, um alles dann zu initialisieren. Viele Dinge erscheinen zwar logisch,aber auch das einfache Spiel im Buch ist für Anfänger nicht einfach und nach dem Buch könnte ich das Spiel von selbst nicht nachprogrammieren. Auch die Art des Aufbaus oder welche Methoden in der Klasse timer oder Framework enthalten sein sollen, wuesste ich danach nicht sofort. Die Grundlagen zu verstehen ist eine Sache. Den Zusammenhang bei größeren Projekten herzustellen, etwas anderes. Ich habe bejm sdl Spiel das Gefühl, dass ich sozusagen von null anfange. Ok für das framework gibt es tutorials und im Buch ist das lediglich besser verpackt Dank Klassen. Zudem benötigt man das Ganze nur ein mal aber eben die komplette Logik nachzuvollziehen und durchzublicken, finde ich schwer. Eine Funktion nachvollziehen ist einfacher als sich durch Programm Code zu hangeln, der endlos lang ist
Bin schon dabei. Was ich als Anfänger aber schwierig finde, ist die Vorgehensweise. Man hat zwar den kompletten Code aber in der Realität würde ich eventuell ein Fenster erzeugen und danach erst eine klasse Framework erstellen, um alles dann zu initialisieren. Viele Dinge erscheinen zwar logisch,aber auch das einfache Spiel im Buch ist für Anfänger nicht einfach und nach dem Buch könnte ich das Spiel von selbst nicht nachprogrammieren. Auch die Art des Aufbaus oder welche Methoden in der Klasse timer oder Framework enthalten sein sollen, wuesste ich danach nicht sofort. Die Grundlagen zu verstehen ist eine Sache. Den Zusammenhang bei größeren Projekten herzustellen, etwas anderes. Ich habe bejm sdl Spiel das Gefühl, dass ich sozusagen von null anfange. Ok für das framework gibt es tutorials und im Buch ist das lediglich besser verpackt Dank Klassen. Zudem benötigt man das Ganze nur ein mal aber eben die komplette Logik nachzuvollziehen und durchzublicken, finde ich schwer. Eine Funktion nachvollziehen ist einfacher als sich durch Programm Code zu hangeln, der endlos lang ist
TigerClaw25
unregistriert
Werbeanzeige