Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Klassen-Krampf

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
15.06.2004, 00:57 Uhr
Tommi Bisic



Soooooooo,
jetzt noch eine letzte Sache für heute bevor ich anfange euch zu sehr zu nerven! :D
Habe ein Programm geschrieben, dass den Abstand von zwei Punkten berechnet.Leider läuft es net so wie ich es will
Es sieht wie folgt aus:

C++:
#include <iostream.h>
#include "CPunkt.h"
#include "CStrecke.h"

void main()
{
    CStrecke s;
    cout<<"Bitte geben sie die Koordinaten vom ersten Punkt ein "<<endl;
    cin>>s.P1.dx>>s.P1.dy;
    cout<<"Bitte geben sie die Koordinaten vom zweiten Punkt ein"<<endl;
    cin>>s.P2.dx>>s.P2.dy;
cout<<"Der Abstand beträgt "<<s.Abstand()<<endl;
}
******************************************************
#include "CPunkt.h"

CPunkt::CPunkt()
{
    dx=0;
    dy=0;
}
********************************************************
#include <math.h>
#include "CStrecke.h"
#include "CPunkt.h"

CStrecke::CStrecke();
{
    P1=0;
    P2=0;
}

CStrecke::Abstand();
{
    ds=sqrtds=sqrt((P1.dx-P2.dx)*(P1.dx-P2.dx)+(P1.dy-P2.dy)*(P1.dy-P2.dy));
    return ds;
}

CStrecke::~CStrecke()
{

}
**************************************************
#if !defined CPunkt_h
#define CPunkt_h

class CPunkt
{
public:
    double dx,dy;
    CPunkt();
    
};

#endif
*****************************************************
#if !defined CStrecke_h
#define CStrecke_h
#include "CPunkt.h"

class CStrecke
{
public:
    double ds;
    CStrecke();
    ~CStrecke();
    double Abstand();
    CPunkt P1,P2;
};

#endif




Leider kommt diese Fehlermeldung:

:\programme\microsoft visual studio\myprojects\klassen teil b\strecke.cpp(2) : fatal error C1083: Include-Datei kann nicht geoeffnet werden: 'CStrecke.h': No such file or directory
Fehler beim Ausführen von cl.exe.

Das Programm wird wahrscheinlich auch noch net laufen, aber wieso diese Fehlermeldung?

Dieser Post wurde am 15.06.2004 um 01:11 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.06.2004, 01:13 Uhr
Pablo
Supertux
(Operator)


Vielleicht, weil du dich vertippt hast? Dein Compiler kann diese Datei nicht öffnen, bzw. nicht finden. Also suche nach der datei und überprüfe, dass du keinen Tippfehler gemacht hast.

Hast du die .h Datei in einem Unterverzeichnis, in einem anderen verzeichnis???

Und noch was, die main Funktion soll mit int deklariert werden und nicht mit void
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 15.06.2004 um 01:14 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
15.06.2004, 01:21 Uhr
Tommi Bisic



Mein Problem waren die Bezeichnungen!
Ich habe die files wie die Klassen genannt also wie hier: CPunkt oder CStrecke.
Das hat dem Compiler wohl net geschmeckt.
Was mich jetzt aber interessieren würde ist, ob ich die Konstrukte und Destrukte hier brauche,falls ja was machen die hier genau?
Warum soll ich
int main(void)
statt
void main()
machen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
15.06.2004, 02:14 Uhr
Pablo
Supertux
(Operator)


An den Namen der Klassen un der Dateien soll es nicht liegen, denn einem normalen C++ Compiler sollte es egal sein, wie die Dateien heißen, solange er die Deklarationen und definitionen gefunden werden.


Zitat:
Tommi Bisic postete
Warum soll ich
int main(void)
statt
void main()
machen?



Das ist ANSI, und du bist im ANSI C/C++ Forum. Siehe FAQ - main - Aufzucht und Pflege
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 15.06.2004 um 02:18 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
15.06.2004, 15:04 Uhr
Tommi Bisic



Hmm,ok,wenn das so festgelegt ist.
Warum lief mein Programm als ich die Konstrukte und Destrukte weggelassen habe,auf einmal.
Ein Konstrukt initialisiert doch eine Instanz.
Deswegen habe ich dx und dy = 0 gesetztWarum muss ich eigentlich nicht P1 und P2 = 0 setzen?sie sind Instanzen der Klasse Cpunkt und in CStrecke enthalten,aber wieso brauche ich keinen Konstrukt und Destrukt bei CStrecke?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
15.06.2004, 15:13 Uhr
0xdeadbeef
Gott
(Operator)


Es hat auch noch nen anderen Hintergrund, dass main int und nicht void ist.

Unter Windows vergisst man das zwar gerne, weil da eh keiner Skripte benutzt, aber ein Programm hat auch einen Rückgabewert, den die ausführende Shell auslesen kann. 0 bedeutet dabei idR Erfolg, alles andere einen Fehler - auf die Art können zum Beispiel Skripte darauf reagieren, wenn einer der Schritte fehlgeschlagen ist.

Eine der häufigsten Anwendungen unter Unix ist wohl

sh:

make && make install


In diesem Fall wird erst make ausgeführt, und wenn das 0 zurückgibt (also erfolgreich beendet wurde), führt die Shell auch make install aus.

Wenn du void main benutzt, kann als Rückgabewert alles mögliche rauskommen, was jede Möglichkeit der Fehlerbehandlung eliminiert. Wenn dein Compiler int main erwartet und nicht mit der Möglichkeit eines void main rechnet, kann sowas sogar vereinzelt zu segfaults führen, sobald die Shell den Rückgabewert auslesen will - das fangen die meisten Compiler aber ab, weil void main inzwischen eine recht weit verbreitete Unsitte ist. Ganz abgesehen davon ist "int" kürzer zu tippen als "void" - warum sollte man also gegen den Standard verstoßen?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
15.06.2004, 15:26 Uhr
Tommi Bisic



Danke für die Antwort
Aber könntest du mir vielleicht auch das erklären was ich weiter unten gefragt habe?Danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
15.06.2004, 16:00 Uhr
ao

(Operator)


Ich vermute, du hattest ein Problem mit der Zuweisung P1 = 0; und P2 = 0;

Damit das geht, braucht die Klasse CPunkt einen Zuweisungsoperator, mit dem man einen Zahlenwert zuweisen kann, also z.B. operator=(int nValue); oder operator=(double dValue);

Wenn du das noch nicht verstehst, macht das nix; das wird dir klarer, wenn du zu Operator-Überladungen kommst.

In deinem Beispiel brauchst du das noch nicht wirklich, weil du alle Punkte immer auf ( 0, 0 ) initialisierst, und das geht auch im Default-Konstruktor.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
15.06.2004, 16:12 Uhr
Tommi Bisic



Danke ao!
Also kann ich getrost auf die Konstrukte und Destrukte in dem Bsp verzichten?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: