wie erstelle ich: dyn. array of long integer, größe: m_nSitze[1]
-
ich sitze grad vor einem UML und bin mir nicht sicher wie ich folgende Anweisung umsetzten soll:
dyn. array of long integer, größe: m_nSitze[1]ich hab auch schon ein wenig recherchiert und zu dynamischen array's folgendes gefunden:
char* c; c=new char[j];..jetzt ist mir nicht ganz klar inwieweit dieser code meine UML Anfrage abdeckt?
wäre dankbar für eure hilfe!

-
-
Hallo
Wenn du den Typ char durch long integer ersetzt dann ja.
Aber ich würde dir empfehlen lieber die selbstverwaltenden C++ Container zu nehmen, in deinem Fall#include <vector> ... std::vector<long int>bis bald
akari
-
Im Moment hast du noch ein Array vom Typen char, du willst aber long integer.
Und m_nSitze[1] soll wohl j sein, nicht?
Falls m_nSitze[1] eine Konstante ist, dann kannst du die als const deklarieren und auch direkt erstellen. (Obwohl ich das jetzt mal nicht vermute).
Da du noch nicht so viel Erfahrung scheinst zu haben, sei hier noch erwähnt, dass in C++, wenn du Speicher per new anforderst, den du auch wieder freigeben musst. (delete c[] in deinem Fall).
-
drakon schrieb:
Im Moment hast du noch ein Array vom Typen char, du willst aber long integer.
Und m_nSitze[1] soll wohl j sein, nicht?
Falls m_nSitze[1] eine Konstante ist, dann kannst du die als const deklarieren und auch direkt erstellen. (Obwohl ich das jetzt mal nicht vermute).
Da du noch nicht so viel Erfahrung scheinst zu haben, sei hier noch erwähnt, dass in C++, wenn du Speicher per new anforderst, den du auch wieder freigeben musst. (delete c[] in deinem Fall).
hi,
danke für eure schnellen antworten

..das mit dem long statt char is klar

ich poste mal die klasse damit es besser verständlich ist:
#include <iostream.h> #include <string.h> using namespace std; class CFlug { private: string m_sAbflugdatum, m_sAbflugzeit; protected: string m_sID; long m_nAbflugairportID, m_nZielairportID, m_nFlugzeugID; (int)m_nSitze[3]; (int)m_nresSitze[3]; #m_pBuchung1: dyn. array of long integer, Größe: m_nSize[1] #m_pBuchung2: dyn. array of long integer, Größe: public: CFlug(); int flugReservieren(long nTicketID, int nKlasse); int ticketErstellen(long nTicketID); }mir geht es um die 2 mit # beginnenden Zeilen, ich weis nicht wie ich diese umsetzen soll?? (sind originalgetreu der Aufgabe entnommen)
pls help
-
Sl4yer88 schrieb:
ich poste mal die klasse damit es besser verständlich ist:
Erstmal grundlegendes nicht konkret zu deinem Problem
1. NIEMALS using namespace innerhalb eines Headers
2. Nach dem C++ Standard von nunmehr 1998 gibt es weder iostream.h noch string.h - entferne bei den includes der Standardbibliothek bitte das .h
3. Solltest du wirklich mit dynamischer Speicherverwaltung (sprich Zeigern und new/delete) arbeiten benötigt deine Klasse auch einen überschriebenen Kopierkonstruktor und Zuweisungsoperator oder alternativ müssen diese unterbunden werden (private ohne Deklaration).
4. Ist deine Klasse wirklich als Basisklasse vorgesehen (das protected deutet es an), wenn ja bitte einen virtuellen Destruktor verwenden!
5. Am Ende der Klasse benötigt das abschließende } ein ;... "class CFlug{...};"cu André
P.S: 6. Zur voraussichtlichen Qualität deines Lehrers/Dozenten... erschlage die Packungsbeilage und kontaktiere deinen Arzt oder Apotheker...
-
asc schrieb:
Sl4yer88 schrieb:
ich poste mal die klasse damit es besser verständlich ist:
Erstmal grundlegendes nicht konkret zu deinem Problem
1. NIEMALS using namespace innerhalb eines Headers
2. Nach dem C++ Standard von nunmehr 1998 gibt es weder iostream.h noch string.h - entferne bei den includes der Standardbibliothek bitte das .h
3. Solltest du wirklich mit dynamischer Speicherverwaltung (sprich Zeigern und new/delete) arbeiten benötigt deine Klasse auch einen überschriebenen Kopierkonstruktor und Zuweisungsoperator oder alternativ müssen diese unterbunden werden (private ohne Deklaration).
4. Ist deine Klasse wirklich als Basisklasse vorgesehen (das protected deutet es an), wenn ja bitte einen virtuellen Destruktor verwenden!
5. Am Ende der Klasse benötigt das abschließende } ein ;... "class CFlug{...};"cu André
P.S: 6. Zur voraussichtlichen Qualität deines Lehrers/Dozenten... erschlage die Packungsbeilage und kontaktiere deinen Arzt oder Apotheker...hi andré,
1. ich war in keiner header datei...
2. wird uns das in der schule noch so beigebracht tschuldige
3. versteh ich nicht ganz sry
4. virtuellen Destruktor??(ich google mal
)
5. ja das ist mir bewusst danke!http://img294.imageshack.us/img294/6119/umlcopyno6.jpg
wie füge ich ein bild ein...

na egal, auf dem Bild ist jedenfalls die Aufgabe(UML) abgebildet die ich versucht habe umzusetzen.
-
Sl4yer88 schrieb:
...
1.
(Wie willst du denn die Klasse in einer anderen Übersetzungseinheit benutzen?!2. Schlecht.
3. Das Problem ist, dass, wenn du dieses Objekt kopierst, wird der Zeiger, den du per new bekommst ebenfalls lediglich kopiert. Das heisst, dass du dann 2 Objekte hast, die auf den gleichen Speicherbereich zeigen. Und wenn nun das erste Objekt zerstört wird, wird der Speicher freigegeben und du hast bei deinem anderen Objekt ein Problem, weil dieser auf einen ungültigen Bereich zeigt. Das heisst, dass dein Programm spätestens bei dem zerstören des 2 Objektes crasht. (Versuchs ruhig mal aus, dann siehst du, was passiert.)
clude <iostream> #include <string> using namespace std; class CFlug { private: string m_sAbflugdatum, m_sAbflugzeit; protected: string m_sID; long m_nAbflugairportID, m_nZielairportID, m_nFlugzeugID; int m_nSitze[3]; int m_nresSitze[3]; std::vector<long int> m_pBuchung1; long int* m_pBuchung2; //#m_pBuchung1: dyn. array of long integer, Größe: m_nSize[1] //#m_pBuchung2: dyn. array of long integer, Größe: public: CFlug(); // Hier kommt noch die Initialisierung von m_pBuchung1/2 rein. virtual ~CFlug ();//Hier schön aufräumen CFlug (CFlug const & r); //copy ctor (brauchst du wegen new, vector wird richtig kopiert..) int flugReservieren(long nTicketID, int nKlasse); int ticketErstellen(long nTicketID); };Dir steht frei, welche Möglichkeit du nutzen kannst. Jedoch ist die std::vector Variante weit aus komfortabler und sicherer.
Bild einfügen geht, glaube ich nicht. (Hier noch für die faulen der Link.

http://img294.imageshack.us/img294/6119/umlcopyno6.jpg
-
drakon schrieb:
1.
(Wie willst du denn die Klasse in einer anderen Übersetzungseinheit benutzen?!Mein Verdacht: alles steht in der einzigen Sourcedatei xD
drakon schrieb:
2. Schlecht.
Nich nur schlecht, so langsam ist dieser Grund auch nicht mehr akzeptierbar. Mögen einige Lehrer keine Motivation zum Lernen haben (grade in einen ihnen fremden Bereich), so sollten sie dennoch in der Lage sein sich zumindestens alle 5 Jahre mal Grundlegend über Änderungen zu informieren.
drakon schrieb:
3. Das Problem ist, dass, wenn du dieses Objekt kopierst, wird der Zeiger, den du per new bekommst ebenfalls lediglich kopiert. Das heisst, dass du dann 2 Objekte hast, die auf den gleichen Speicherbereich zeigen. Und wenn nun das erste Objekt zerstört wird, wird der Speicher freigegeben und du hast bei deinem anderen Objekt ein Problem, weil dieser auf einen ungültigen Bereich zeigt. Das heisst, dass dein Programm spätestens bei dem zerstören des 2 Objektes crasht. (Versuchs ruhig mal aus, dann siehst du, was passiert.)
Ich zeige dies am besten an einen Beispiel:
class A { private: long* dynamischesArray; public: A() : value(new long[20]) {} ~A() { delete[] dynamischesArray; } }; int main() { A a1; A a2 = a1; } // <-- CrashSo... also grundlegend:
Zu jedem new gehört ein delete, zu jedem new[] ein delete[].
An diese Regel haben wir uns scheinbar gehalten, aber leider nur scheinbar...Grundsätzlich gibt es 4 wichtige Methoden die mit der Objekterzeugung und -zuweisung zu tun haben, und die auch wenn man sie selbst nicht schreibt automatisch generiert werden:
class A { A(); // Konstruktor ~A(); // Destruktor A(A const &); // Kopierkonstruktor A& operator=(A const &); // Zuweisungsoperator };Wann wird nun welcher davon aufgerufen, und was tun die Automatisch generierten:
int main() { A a1; // Konstruktor A a2(a1); // Kopierkonstruktor A a3 = a1; // Für Anfänger wider erwarten: Auch Kopierkonstruktor (ist Initialisierung) a2 = a3; // Zuweisungsoperator } // <-- Destruktoren (In umgekehrter Reihenfolge der InstanziierungSo, nun haben wir schonmal den ersten Punkt geklärt, nun zum Zweiten: Was machen die automatisch generierten Operatoren?
Grundsätzlich wird beim Kopierkonstruktor und Zuweisungsoperator, wenn nicht selbst geschrieben, eine sogenannte flache Kopie angelegt. Dies entspricht einer bitweisen Kopie. Im Falle von Zeigern bedeutet dies, das der Zeiger kopiert wird, sprich: beide Zeiger zeigen anschließend auf die gleiche Speicheradresse.
Nun wird der Destruktor von dem ersten aufgerufen, das delete[] erfolgt und löscht den (nunmehr gemeinsamen) Speicherbereich. Nun wird der zweite Destruktor gelöscht, und löscht nun den Speicherbereich ebenso, oder greift darauf zu => Undefiniertes Verhalten, Access Violation...
Also müssen wir uns etwas einfallen lassen. Das heißt im Grunde man schreibt die beiden weiteren Operatoren auch noch, sorgt dafür das nicht flache Kopien angelegt werden, sondern auch die dahinter liegenden Speicherbereiche kopiert werden, und hat anschließend das Problem auch nicht mehr...
cu André
-
asc schrieb:
...
Zu 1: Ja, das war mir schon klar, war aber ein Hinweis, dass er sieht, wo das Problem dabei ist.

Zu 3: Schöne erläuterung des Problems.
