Problem mit "Medienverwaltung"

  • C++

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Problem mit "Medienverwaltung"

    Hey FSB'ler,

    hab mal wieder n kleines Problem. Diesmal mit C++..
    Und zwar müssen wir im OOP Kurs eine kleine "Medienverwaltung" schreiben. Bin eigentlich ganz zufrieden, bis auf die Tatsache dass ich, seitdem ich den Code in drei verschiedenen Dateien (header.h für Klassendefinitionen, main.cpp: Hauptprogramm, classfunc.cpp: Klassen)
    immer Fehler beim Compilieren bekomme :rolleyes:

    Hier die Fehlermeldung(en):

    Quellcode

    1. [email protected]:~/Dokumente/Studium/2.Semester/OOP/übung2$ g++ -o ausgabe main.cpp classfunc.cpp
    2. /tmp/ccx7maTO.o: In function `Buch::Buch()':
    3. classfunc.cpp:(.text+0x476): undefined reference to `Medium::Medium(int)'
    4. /tmp/ccx7maTO.o: In function `Buch::Buch()':
    5. classfunc.cpp:(.text+0x58c): undefined reference to `Medium::Medium(int)'
    6. /tmp/ccx7maTO.o: In function `Video::Video()':
    7. classfunc.cpp:(.text+0x6a2): undefined reference to `Medium::Medium(int)'
    8. /tmp/ccx7maTO.o: In function `Video::Video()':
    9. classfunc.cpp:(.text+0x7b8): undefined reference to `Medium::Medium(int)'
    10. collect2: ld gab 1 als Ende-Status zurück
    11. [email protected]:~/Dokumente/Studium/2.Semester/OOP/übung2$
    Alles anzeigen


    Hier der/die Code(s):

    PHP-Quellcode

    1. //Headerdatei (header.h)
    2. #ifndef HEADER_H
    3. #define HEADER_H
    4. #include <iostream>
    5. #include <iomanip>
    6. #include <string>
    7. #include <cstdio>
    8. using namespace std;
    9. class Medium {
    10. public:
    11. Medium();
    12. Medium(int);
    13. int getsignatur();
    14. void print();
    15. void entleihen();
    16. void rueckgabe();
    17. protected:
    18. int signatur;
    19. string titel;
    20. string typ;
    21. bool status;
    22. };
    23. class Buch : public Medium {
    24. public:
    25. Buch();
    26. void print();
    27. void entleihen();
    28. void rueckgabe();
    29. private:
    30. int seiten;
    31. };
    32. class Video : public Medium {
    33. public:
    34. Video();
    35. void print();
    36. void entleihen();
    37. void rueckgabe();
    38. private:
    39. float spieldauer;
    40. };
    41. #endif
    42. //main.cpp
    43. #include "header.h"
    44. const int S = 20;
    45. int main(){
    46. const int N = 10;
    47. char eingabe;
    48. Medium* neuM[N];
    49. int m = 0, v = 0, b = 0;
    50. Video* neuV[N] = {NULL};
    51. Buch* neuB[N] = {NULL};
    52. int sig_check;
    53. while(1){
    54. cout <<endl<<endl;
    55. cout << "m--> Anlegen und Initialisieren" <<endl;
    56. cout << "b--> Hinzufügen und Initialisieren eines neuen Buches" <<endl;
    57. cout << "v--> Hinzufügen und Initialisieren eines neuen Videos" <<endl;
    58. cout << "l--> Anzeige der Medieneigenschaft" <<endl;
    59. cout << "e--> Ausleihen" <<endl;
    60. cout << "r--> Rückgabe" <<endl;
    61. cout << "q--> Programmende" <<endl <<endl;
    62. cout << "Bitte wählen Sie einen Modus aus: ";
    63. cin >> eingabe;
    64. cout << "Ihre Auswahl: " << eingabe <<endl;
    65. switch(eingabe){
    66. case 'm': //if(neu == NULL)
    67. //delete neu;
    68. if (m >= N)
    69. cout << "Array voll!";
    70. else{
    71. neuM[m] = new Medium;
    72. m++;
    73. }
    74. break;
    75. case 'b': if (b >= N)
    76. cout << "Array voll!";
    77. else{
    78. neuB[b] = new Buch;
    79. b++;
    80. }
    81. break;
    82. case 'v': if (v >= N)
    83. cout << "Array voll!";
    84. else{
    85. neuV[v] = new Video;
    86. v++;
    87. }
    88. break;
    89. case 'l': cout << right << setw(S) << setw(S) << "Medieneigenschaften" << endl;
    90. cout << left << setw(S) << "Signatur" << left << setw(S) << "Typ" << left << setw(S) << "Titel" << left << setw(S) << "Status" << right << setw(S) << "weitere Daten" << endl;
    91. for (int i = 0; i < m; i++){
    92. neuM[i]->print();
    93. cout << endl;
    94. }
    95. for (int i = 0; i < b; i++){
    96. neuB[i]->print();
    97. cout << endl;
    98. }
    99. for (int i = 0; i < v; i++){
    100. neuV[i]->print();
    101. cout << endl;
    102. }
    103. break;
    104. case 'e': cout << "Bitte Signatur zur Überprüfung eingeben: ";
    105. cin >> sig_check;
    106. for(int i = 0; i <= m; i++){
    107. if (neuM[i]->getsignatur() == sig_check)
    108. neuM[i]->entleihen();
    109. }
    110. for(int i = 0; i <= b; i++){
    111. if (neuB[i]->getsignatur() == sig_check)
    112. neuB[i]->entleihen();
    113. }
    114. for(int i = 0; i <= v; i++){
    115. if (neuV[i]->getsignatur() == sig_check)
    116. neuV[i]->entleihen();
    117. }
    118. break;
    119. case 'r': cout << "Bitte Signatur zur Überprüfung eingeben: ";
    120. cin >> sig_check;
    121. for(int i = 0; i <= m; i++){
    122. if (neuM[i]->getsignatur() == sig_check)
    123. neuM[i]->rueckgabe();
    124. }
    125. for(int i = 0; i <= b; i++){
    126. if (neuB[i]->getsignatur() == sig_check)
    127. neuB[i]->rueckgabe();
    128. }
    129. for(int i = 0; i <= v; i++){
    130. if (neuV[i]->getsignatur() == sig_check)
    131. neuV[i]->rueckgabe();
    132. }
    133. break;
    134. case 'q': return 0;
    135. break;
    136. }
    137. }
    138. return 0;
    139. }
    140. //classfunc.cpp
    141. #include "header.h"
    142. const int S = 20;
    143. Medium::Medium(){
    144. status = false;
    145. cout << "Bitte Mediendaten angeben: Signatur und Titel" <<endl
    146. << "Signatur: ";
    147. cin >> signatur;
    148. cin.ignore(10,'\n');
    149. cout << "Titel: ";
    150. getline(cin, titel);
    151. typ.assign("Medium");
    152. }
    153. void Medium::print(){
    154. cout << left << setw(S) << signatur << left << setw(S) << typ << left << setw(S) << titel << left <<setw(S) << status;
    155. }
    156. int Medium::getsignatur(){
    157. return signatur;
    158. }
    159. void Medium::entleihen(){
    160. if(status == true){
    161. status = false;
    162. cout << "Medium bereits ausgeliehen!";
    163. }
    164. }
    165. void Medium::rueckgabe(){
    166. if(status == false){
    167. status = true;
    168. cout << "Medium bereits zurück!";
    169. }
    170. }
    171. Video::Video():Medium(0) {
    172. status = false;
    173. cout << "Bitte Videodaten angeben: Signatur, Titel und Spieldauer" <<endl
    174. << "Signatur: ";
    175. cin >> signatur;
    176. cin.ignore(10,'\n');
    177. cout << "Titel: ";
    178. getline(cin, titel);
    179. cout << "Spieldauer: ";
    180. cin >> spieldauer;
    181. typ.assign("Video");
    182. }
    183. void Video::print(){
    184. Medium::print();
    185. cout << right << setw(S) << spieldauer << " min";
    186. }
    187. void Video::entleihen(){
    188. Medium::entleihen();
    189. }
    190. void Video::rueckgabe(){
    191. Medium::rueckgabe();
    192. }
    193. Buch::Buch():Medium(0) {
    194. status = false;
    195. cout << "Bitte Buchdaten angeben: Signatur, Titel und Seiten" <<endl
    196. << "Signatur: ";
    197. cin >> signatur;
    198. cin.ignore(10,'\n');
    199. cout << "Titel: ";
    200. getline(cin, titel);
    201. cout << "Seiten: ";
    202. cin >> seiten;
    203. typ.assign("Buch");
    204. }
    205. void Buch::print(){
    206. Medium::print();
    207. cout << right << setw(S) << seiten << " Seiten";
    208. }
    209. void Buch::entleihen(){
    210. Medium::entleihen();
    211. }
    212. void Buch::rueckgabe(){
    213. Medium::rueckgabe();
    214. }
    Alles anzeigen


    Kann mir vielleicht jemand weiter helfen? Komm nicht drauf was der Compiler von mir will bzw. warum er meckert. Compiler is C++

    MfG kunks
  • Dann wäre sowas denk ich eleganter:

    PHP-Quellcode

    1. Medium::Medium(BOOL subclass = false) {
    2. if(!subclass) {
    3. // mache das was medium machen soll
    4. } else { // *edit: Wenn wirklich nichts gemacht werden soll kann das else natürlich gelöscht werden
    5. // mache nichts
    6. }
    7. }


    so kannst du den konstruktor für ein medium mit default aufrufen: Medium bla = new Medium();

    und in der subklasse z.B. im Buch konstruktor: Buch::Buch():Medium(true) { /*...*/ }

    P.S. Alles ungetestet ;) Man möge Schreibfehler entschuldigen
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • Wieso machst Du denn die Eingabe im Konstruktor ???
    IMHO sollten im Konstruktor nur allgemeine Initialisierungen stattfinden.
    Spendiere doch den Klassen einfach noch die Methoden
    Medium::eingabe (), Video ::eingabe () und Buch :: eingabe ()
    Dann brauchst Du auch den Dummy Konstruktor nicht mehr.
  • Also erstmal :danke: für die vielen guten Antworten. Das mit der fehlenden Definition war natürlich richtig, daran lag es dass das Programm erst gar nicht kompiliert werden konnte.

    Jo stimmt, Eingabe im Konstruktor ist nicht so praktisch, sollen wir aber so machen :rolleyes:
    Naja, ich weiß jetzt nicht ob ihr mich richtig verstanden habt, wegen dem Dummy Konstruktor. Der hat halt nur die Funktion, das beim Anlegen eines neuen Buches bzw. Videos, nicht der gleiche Text wie beim Medium kommt, also statt "Bitte Mediendaten eingeben.." soll, beispielsweise beim Buch, "Bitte Buchdaten eingeben.." angezeigt werden. Unser Tutor hat dann gemeint ich könnt son Dummy machen und den halt leer lassen, das nicht der Default-Konstruktor aufgerufen wird...

    Hab jetzt no n Problem mit der entleihen() bzw. rueckgabe() Methode.
    Kompilieren geht, nur kommt, wenn die beiden Methoden augerufen werden und ich was eintippe immer "segmentation fault core dump" und mein Programm bricht ab :(

    Was kann das sein?
  • kunks schrieb:

    Hab jetzt no n Problem mit der entleihen() bzw. rueckgabe() Methode.
    Kompilieren geht, nur kommt, wenn die beiden Methoden augerufen werden und ich was eintippe immer "segmentation fault core dump" und mein Programm bricht ab :(

    Was kann das sein?

    Vermutlich hast du zu wenig Speicher für die Eingabe allokiert. Normal kommt so ein Fehler vor wenn du versuchst mehr Daten in eine Variable zu speichern als du im Speicher vorgesehen hast.
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • Also die Eingabe is korrekt, es wird genug Speicher allokiert. Bin echt am Ende mit meinen Ideen.. Bekomm immer "Segmentation fault"

    Kann sich das vllt. jemand kurz anschaun, ob die Methode "rueckgabe" bzw. das Kommando "r" wenigstens vom Prinzip funktionieren müsste.

    PHP-Quellcode

    1. //Kommando "r" in main.cpp
    2. case 'r': cout << "Bitte Signatur zur Überprüfung eingeben: ";
    3. cin.ignore(100, '\n');
    4. cin >> sig_check;
    5. //cout << sig_check;
    6. for(int i = 0; i <= m; i++){
    7. if (neuM[i]->getsignatur() == sig_check)
    8. neuM[i]->rueckgabe();
    9. }
    10. for(int i = 0; i <= b; i++){
    11. if (neuB[i]->getsignatur() == sig_check)
    12. neuB[i]->rueckgabe();
    13. }
    14. for(int i = 0; i <= v; i++){
    15. if (neuV[i]->getsignatur() == sig_check)
    16. neuV[i]->rueckgabe();
    17. }
    18. break;
    19. //rueckgabe Methode
    20. void Medium::rueckgabe(){
    21. if(status == false){
    22. status = true;
    23. cout << "Medium bereits zurück!";
    24. }else cout << "Medium ausgeliehen";
    25. }
    26. //die getsignatur Methode
    27. int Medium::getsignatur(){
    28. return signatur;
    Alles anzeigen


    Wäre euch sehr dankbar ;)

    MfG kunks
  • Also, ich sehe es auch so wie janine.

    Du hast den Konstruktor und den Dummy-Konstruktor im Header definiert.
    Also Medium (); und Medium (int);

    Aber in classfunc.cpp gibt es keine Implementierung des Dummy-Konstruktors, sondern nur den Standard-Konstruktors:
    Medium::Medium()
    { ... }
    Es fehlt aber
    Medium::Medium (int i)
    { ... }

    Daher kommt dann auch die Fehlermeldung, da die abgeleiteten Klassen Buch und Video auf den Dummy-Konstruktor zugreifen wollen.