Forum: C++: Vad är det jag gör fel??

Forum huvudsida -> Programmering -> C++: Vad är det jag gör fel??

Sidor: 1

Till botten

olle 16:09 - 21:a Juli 2006 | Post #1
Medlem
Inlägg: 57


Skicka PM
Hej!

Varje gång jag försöker kompilera så får jag ett fel som jag aldrig fått tidigare.
Har kunnat köra denna kod tidigare utan något fel.

Har en basklass med en subklass. När jag skapar en objekt av typen basklass eller subklass så får jag detta felmeddelande:

"main.cpp:14: undefined reference to `Minnestarning::Minnestarning()'
collect2: ld returned 1 exit status"

Här e koden:

  1.  
  2.  
  3. //main.cpp
  4. //--------------------------
  5. #include<iostream>
  6. #include<stdlib.h>
  7. #include<time.h>
  8. #include"tarning.h"
  9. #include"minnestarning.h"
  10.  
  11. using namespace::std;
  12.  
  13. int main(){
  14.  
  15. srand(time(0));
  16.  
  17. // Tarning ett;
  18. Minnestarning tva;
  19.  
  20. return 0;
  21. }
  22.  
  23. //tarning.h
  24. //---------------
  25. #ifndef TARNING_H
  26. #define TARNING_H
  27.  
  28.  
  29. class Tarning {
  30. public:
  31. Tarning();
  32. void kasta();
  33. int uppsida();
  34. private:
  35. int sida;
  36. };
  37. #endif
  38.  
  39. //minnestarning.h
  40. //---------------------
  41. #ifndef MINNESTARNING_H
  42. #define MINNESTARNING_H
  43.  
  44. class Minnestarning : public Tarning {
  45. public:
  46. Minnestarning();
  47. void kasta();
  48. private:
  49. int check;
  50. };
  51. #endif
  52.  
  53. //tarning.cpp
  54. //--------------
  55. #include"tarning.h"
  56. #include<time.h>
  57. #include<stdlib.h>
  58.  
  59. Tarning::Tarning(){ sida = 0; }
  60.  
  61. void Tarning::kasta(){ sida = rand()%6+1; }
  62.  
  63. int Tarning::uppsida(){ return sida; }
  64.  
  65. //minnestarning.cpp
  66. //------------------------
  67. #include"minnestarning.h"
  68. #include<time.h>
  69. #include<stdlib.h>
  70.  
  71. Minnestarning::Minnestarning() : Tarning() {
  72. check = 0;
  73. }
  74.  
  75. void Minnestarning::kasta(){
  76.  
  77. int temp = 0;
  78.  
  79. temp = Tarning::uppsida();
  80.  
  81. while ( true ){
  82. Tarning::kasta();
  83. if ( temp != Tarning::uppsida() )
  84. break;
  85.  
  86. }
  87. }
  88. }


Tack i förhand

-------------------------
Ingen signatur!



Nissebosselasse 17:01 - 21:a Juli 2006 | Post #2
Medlem
Inlägg: 490


Skicka PM
Du behöver inte anropa basklassens konstruktor i den ärvda klassens konstruktor; den anropas automatiskt.

Dessutom borde du inkludera basklassens headerfil (tarning.h) antingen i minnestarning.h (där skulle jag lagt den), eller i minnestarning.cpp, för som det är nu så vet inte den ärvda klassen vad en tarning är.

-------------------------
http://pushingcows.se
Gula Nallen



olle 17:08 - 21:a Juli 2006 | Post #3
Medlem
Inlägg: 57


Skicka PM
stämmer att jag inte behöver anropa baskonstruktorn. Tog bort den och har includerat tarning.h i minnestarning.h. Men får fortfarande samma fel

/main.cpp:14: undefined reference to `Minnestarning::Minnestarning()'
collect2: ld returned 1 exit status

Tycker det verkar skumt

-------------------------
Ingen signatur!



olle 17:16 - 21:a Juli 2006 | Post #4
Medlem
Inlägg: 57


Skicka PM
När jag lägger alla koder i samma fil så fungerar det och kompilera. Så felet ligger i includeringen i alla filer. Hehe får kolla upp det lite nogrannare..

tack för tipset

-------------------------
Ingen signatur!



Nissebosselasse 11:29 - 22:a Juli 2006 | Post #5
Medlem
Inlägg: 490


Skicka PM
Jag klippte och klistra in din kod precis som du skrev den (i de olika filerna som du angav i kommentarerna), kompilerade, och fick då (naturligtvis) en rad fel, men genom att åtgärda den första så löste sig resten.
Det första felet var det som jag skrev om, nämligen att basklassen "tarning" inte är känd för den ärvda klassen "minnestarning".

Den enda ändringen jag gjorde var följande (i minnestarning.h, se rad 5):
  1.  
  2. #ifndef MINNESTARNING_H
  3. #define MINNESTARNING_H
  4.  
  5. // Inkludera basklassen, så att den blir känd här
  6. #include "tarning.h"
  7. class Minnestarning : public Tarning {
  8. public:
  9. Minnestarning();
  10. void kasta();
  11.  
  12. private:
  13. int check;
  14. };
  15. #endif


Undvik att lägga alla klassdefinitioner i samma fil; det försökte jag också göra en gång för länge sen, och det fungerade fram tills vissa klasser behövde veta om varandra i en viss ordning (då jag började flytta runt textblocken i headerfilen...ingen bra lösning).

Bra regel: för varje klass finns två filer; en headerfil (.h) som säger hur klassen ser ut (eventuellt vilken den ärver från), och en .cpp som innehåller själva koden.

Lite andra grejor: i minnestarning.cpp, i funktionen kasta (), som ser ut så här:
  1.  
  2. void Minnestarning::kasta()
  3. {
  4. int temp = 0;
  5.  
  6. temp = Tarning::uppsida();
  7.  
  8. while ( true ) {
  9. Tarning::kasta();
  10. if ( temp != Tarning::uppsida() )
  11. break;
  12. }
  13. }

Du behöver inte ange att det är basklassens funktion (rad 6) som du anropar; eftersom du har ärvt den "ingår" den bland de andra metoderna för den aktuella klassen.
Den enda gången du skulle behöva göra så här, är om du ärver från flera basklasser, där det finns metoder som delar samma namn.

-------------------------
http://pushingcows.se
Gula Nallen



olle 01:36 - 24:e Juli 2006 | Post #6
Medlem
Inlägg: 57


Skicka PM
tackar, uppskattar all hjälp.

Den fungerar nu osv Smiley


-------------------------
Ingen signatur!



Sidor: 1

Forum huvudsida -> Programmering -> C++: Vad är det jag gör fel??
Atom feed

Du får inte posta i den här tråden | Till toppen