Du bist nicht angemeldet.

Werbeanzeige

1

08.08.2012, 11:29

Verweis auf nicht aufgelöstes externes Symbol ?

Hallo, ich will gerade als Übung für mich selbst ein Programm schreiben, der ganz einfach durch Eingabe von Paramtern einen Kreisumfang und co. berechnet (c++).

Das habe ich auch folgendermaßen getan.

gui.h

C-/C++-Quelltext

1
2
3
4
5
class CGui
{
public:
    void application();
};


gui.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>#include <string>using namespace std;#include "Kreis.h"#include "gui.h"#include <iomanip>
void CGui::application(){   float r;    // Radius       CKreis *poi = NULL; //float a;  // Seitenlaenge a   //float b;  // Seitenlaenge b   int auswahl;    //Auswahl   

    do {        cout << "\nWelches Teil hat das Kamerasystem erfasst?:\t";      cout << "\n1 = Kreis?:\t";      cout << "\n2 = Rechteck?:\t";       cout << "\nGeben Sie 1 oder 2 ein!:\t";          if ((cin >> auswahl)&& ((auswahl==1)||(auswahl==2))) {    // hat geklappt => raus aus der schleife    break;  } else {    cerr << "Sie haben ein ungueltiges Zeichen eingegeben! Versuchen Sie es erneut.\n";    cin.clear(); // Fehlerzustand zurücksetzen    cin.ignore(1);  }} while (cin);
    
    if(auswahl=1)           {       do {              cout << "\nGeben Sie den Radius ein:\n";  if ((cin >> r)&&((r>1)&&(getchar()=='\n'))) {    // hat geklappt => raus aus der schleife    break;  } else  {    cerr << "Sie haben eine ungueltige Zahl eingegeben! Versuchen Sie es erneut.\n";    cin.clear(); // Fehlerzustand zurücksetzen     cin.ignore(1);  }} while (cin);               }
    poi = new CKreis(r);
        cout << "\nDer Kreisumfang des Kreises beträgt:";  cout << "\t";   cout << poi->KreisSL(); cout << "\n";   system("Pause");}/cpp]


kreis.h
[cpp]class CKreis{protected:    float r;    // Radius
public:     CKreis(float r=2);          float KreisSL();            float KreisFI();};




kreis.cpp

C-/C++-Quelltext

1
2
3
4
#include <iostream>#define _USE_MATH_DEFINES#include <math.h>using namespace std;#include "Kreis.h"
CKreis::CKreis(float r) {}
float CKreis::KreisSL() {       return(2*3.21*r);   } 
float CKreis::KreisFI() {     return((r*r)*3.21); }


main.h

C-/C++-Quelltext

1
2
3
#include "gui.h"

int main(){CGui go; go.application();return 0;}


Das sind die ganzen Dateien die ich hab.
Es kommen aber die Fehler:


1>gui.obj : error LNK2028: Nicht aufgelöstes Token (0A000434) ""public: __thiscall CKreis::CKreis(float)" (??0CKreis@@$$FQAE@M@Z)", auf das in Funktion ""public: void __thiscall CGui::application(void)" (?application@CGui@@$$FQAEXXZ)" verwiesen wird.
1>gui.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall CKreis::CKreis(float)" (??0CKreis@@$$FQAE@M@Z)" in Funktion ""public: void __thiscall CGui::application(void)" (?application@CGui@@$$FQAEXXZ)".

Ich würde mich total freuen, wenn mir jemand sagen würde weshalb das passiert.

EDIT: Warum wird der obige Code falsch formatiert :S?

Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »Klebestreifen« (08.08.2012, 12:18)


2

08.08.2012, 11:32

Willkommen im Forum.
Du hast den Konstruktor von CKreis nicht definiert.

C-/C++-Quelltext

1
2
3
CKreis::CKreis(float r) {
...
}

3

08.08.2012, 11:34

Hallo :)

Danke, und wie und in welcher Datei mache ich das?

4

08.08.2012, 11:35

Ich würde Kreis.cpp empfehlen.

Edit: Wenn es ein leerer Konstruktor ist könntest du auch auch in der Header-Datei (Kreis.hpp) machen.

C-/C++-Quelltext

1
2
3
4
class Kreis {
public:
    Kreis::Kreis() {}
}

5

08.08.2012, 11:37

Haha klappt.

Kannst Du mir sagen wozu dieser Schritt nötig war, und was dieser genau macht, damit ich das auch versteh?

6

08.08.2012, 11:41

Wenn du eine Funktion bzw. Klasse benutzt, die du nur in der Header deklariert hast und nicht definiert hast, dann weiß der Kompiler nicht was er ausgeführt werden sollte. Und es kommt zu Fehler.

7

08.08.2012, 11:47

Okay vielen vielen vielen Dank.
Hast mir wirklich weitergeholfen^^

FSA

Community-Fossil

Beiträge: 1 933

Wohnort: Hessen

  • Private Nachricht senden

8

08.08.2012, 11:53

Zitat von »Delop«


[...], dann weiß der Kompiler nicht was er ausgeführt werden sollte.

Wenn du es erklärst, dann aber auch richtig ;) Der Linker weiß nicht mit welcher Funktion er die Deklaration verknüpfen soll.

Zitat von »LetsGo«

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veralteten strukturieren Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

9

08.08.2012, 11:54

Wenn du es erklärst, dann aber auch richtig ;) Der Linker weiß nicht mit welcher Funktion er die Deklaration verknüpfen soll.
Ich glaube er weiß nicht, was ein Linker ist ;) (nichts gegen ihn)

FSA

Community-Fossil

Beiträge: 1 933

Wohnort: Hessen

  • Private Nachricht senden

10

08.08.2012, 11:59

Kann sein, aber trotzdem wird er jetzt beim nächsten mal (wahrscheinlich) Kompilierungsfehler schreiben, statt Linkerfehler :P
@Klebestreifen:
LNKXXXX sind immer Linkerfehler / Warnungen
CXXXX sind immer Compilerfehler / Warnungen

http://de.wikipedia.org/wiki/Linker_%28Computerprogramm%29

Das sollte dann alle erklärt haben ;)
Grüße.

Zitat von »LetsGo«

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veralteten strukturieren Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Werbeanzeige