C++ Bin ratlos mit Fehler C2660

Faralis

Cadet 1st Year
Dabei seit
Apr. 2015
Beiträge
8
Hallo, ich bin ein Absoluter C++ Neuling (habe vor 2 Wochen mein Wirtschaftsinformatik Studium begonnen) und unser lieber Professor liefert leider kein mir sehr verständliches Script geschweige denn finde ich das was ich suche im Netz. (nach mehreren Stunden suchen)
Also habe ich mich fix hier im Forum angemeldet und hoffe doch bald (bis Mi Abend muss der dumme Quellcode stehen) Hilfe gefunden und das Problem ausgemerzt zu haben.

Es geht um folgendes:
Ich muss mit Klassen Volumen, Mantelfläche und Oberfläche eines Hohlzylinders erstellen - ohne Klassen habe ich das hinbekommen, selbst die Klasse steht soweit mit ihren Methoden zur Berechnung der einzelnen gesuchten Objekte.
Was ich nicht hinbekomme ist das Aufrufen der Ergebnisse in der float main Funktion.
Die Klasse habe ich einfach wie vom Prof gewünscht in der Quelldatei stehen - für einen Neueinsteiger wohl auch leichter ^^

Meine Frage ist nun: wie kann ich es schaffen, dass mir die Ergebnisse ausgegeben werden, ohne dass ich die Berechnungen unten einfach reinkopiere? Ich MUSS es unbedingt mit den Methoden machen, erhalte jedoch immer die Fehlermeldung error C2660 - leider habe ich kein Übungsnahes Beispiel vom Professor oder gar etwas gefunden im Netz/Buch was mir dabei helfen würde. :freak: Ich verzweifle nun schon seit ca 5 Stunden an dem Quellcode.
Eine weitere Frage wäre dann noch, wie sähe eine ordentliche Dokumentation dazu aus? Verlangt mein Prof leider ohne auch nur erwähnt zu haben, wie eine Dokumentation auszusehen hat :confused_alt:

Mein Quellcode sieht also wie folgt aus:

Code:
#include <iostream>
using namespace std;

double V=0.0, M=0.0, O=0.0; // Volumen, Mantel, Oberflaeche
double R, r, h; // Aussenradius, Innenradius, Hoehe
double integerS; //Für Anwenderentscheidung Fortsetzen oder beenden

class Hohlzylinder
{
public:
 Hohlzylinder();
 
 double Hohlzylinder::Volumen(double R, double r, double h) // Berechnung des Volumens als Methode
 {
  double V = 0.0;
  V = 3.1416*(R*R - r*r)*h;
  return V ;
 }
 double Hohlzylinder::Mantel(double R, double r, double h) // Berechnung des Mantels als Methode
 {
  double  M = 0.0;
  M = 2 * 3.1416*(R + r)*h;
  return M ;
 }
 double Hohlzylinder::Oberflaeche(double R, double r, double h) // Berechnung der Oberflaeche als Methode
 {
  double O = 0.0;
  O = 2 * 3.1416*(R + r)*(R - r + h);
  return O ;
 }

};




float main()
{

 while (integerS <= 0)
 {
  cout << "+++++++++++++++++++++++++++++++++++++++++++";
  cout << "\n\n\n";
  cout << "Ich bin ein Programm zur Berechnung \n verschiedener Groessen eines Hohlzylinders.\n"
   << "Zuerst berechnen wir das Volumen, \n gib nachfolgend die Werte \n"
   << "der Hoehe h, den Aussenradius R und den Innenradius r ein.";
  cout << "\n\n\n";
  cout << "Gib jetzt bitte den Wert der Hoehe h \n ein und bestaetige mit Enter.\n";
  cin >> h;
  cout << "\n\n";
  cout << "Gib jetzt bitte den Wert des Aussenradius R \n ein und bestaetige mit Enter.\n";
  cin >> R;
  cout << "\n\n";
  cout << "Gib jetzt noch den Wert des Innenradius r \n ein und bestaetige erneut.\n";
  cin >> r;

  Hohlzylinder Ergebnisse;
  Ergebnisse.Hohlzylinder::Volumen ( ) ;
  Ergebnisse.Hohlzylinder::Mantel ( ) ;
  Ergebnisse.Hohlzylinder::Oberflaeche ( ) ;
   

  cout << "+++++++++++++++++++++++++++++++++++++++++++";
  cout << "\n\n\n";
  cout << "Das Volumen des Hohlzylinders betraegt:" << V;
  cout << "\n\n";
  cout << "Die Mantelflaeche Innen und Aussen betraegt:" << M;
  cout << "\n\n";
  cout << "Die Oberflaeche des Hohlzylinders betraegt:" << O;
  cout << "\n\n\n";
  cout << "Gebe nun 0 ein, um von vorne zu beginnen \n oder tippe 2 ein, um das \n Programm zu beenden.\n"; //Entscheidungsmöglichkeit für Anwender Fortsetzen oder Beenden
  cout << "+++++++++++++++++++++++++++++++++++++++++++\n";
  cin >> integerS;

 };

 return 0;
}
 
Zuletzt bearbeitet:

WhyNotZoidberg?

Rear Admiral
Dabei seit
Aug. 2014
Beiträge
6.106
willkommen im forum.

kleiner tipp:
verwende doch bitte die
Code:
funktion hier im forum, dann wirds übersichtlicher ;)
 

phm666

Lt. Junior Grade
Dabei seit
Dez. 2011
Beiträge
396
Gib doch mal bitte an, mit welchem Compiler/IDE du arbeitest. Klingt für mich nach MS. Sonst kann man da nicht viel zu sagen.
Bei der Kommentierung würde ich vorschlagen, dass du die Methoden (falls du welche benutzt) kommentierst und sonst logisch zusammenhängende Codeblöcke. Wie du das genau machst, kommt auch auf die IDE an. Ich habe mal mit Doxygen gearbeitet, und das ist schon sehr mächtig.

Beispiel:

// Methode macht einfach FooBar
void fooBar() {
// einfach nur addieren und dann ausgeben
int sum = 2+4;
printf("Summe: %d", sum);
}
 

Autokiller677

Vice Admiral
Dabei seit
Jan. 2009
Beiträge
6.498
Erstmal gibt es float main() afaik nicht (oder haben die das geändert?). Die main() muss immer int sein.

Dazu musst du hier: Ergebnisse.Hohlzylinder::Volumen ( ) ; in den Klammern die Funktionsargumente mit übergeben. Und in den nachfolgenden Zeilen natürlich auch.

Zudem sollte der Funktionsaufruf auch mit Ergebnisse.Volumen(R,r,h); möglich sein. Ergebnisse ist bereits ein Hohlzylinder und muss das nicht jedes mal gesagt bekommen.

Edit: Sehe gerade, dass du das über globale Variablen machst. Nicht optimal, dann brauchst du aber keine Argumente im Funktionsaufruf (2. Punkt), und auch die Funktionsdeklarationen brauchen den nicht. Dann musst du aber die Varialben nicht in den Funktionen neu deklarieren.

Hier ein Beispiel das laufen sollte:
Code:
#include <iostream>
using namespace std;

class Hohlzylinder
{
double R, r, h;
public:
Hohlzylinder(double R_in, double r_in, double h_in): R(R_in), r(r_in), h(h_in){};

double Volumen() // Berechnung des Volumens als Methode
{
V = 3.1416*(R*R - r*r)*h;
return V ;
}
double Mantel() // Berechnung des Mantels als Methode
{
M = 2 * 3.1416*(R + r)*h;
return M ;
}
double Oberflaeche() // Berechnung der Oberflaeche als Methode
{
O = 2 * 3.1416*(R + r)*(R - r + h);
return O ;
}
};

int main()
{
double R, r, h;
int integerS = 0;
while (integerS <= 0)
{
cout << "+++++++++++++++++++++++++++++++++++++++++++";
cout << "\n\n\n";
cout << "Ich bin ein Programm zur Berechnung \n verschiedener Groessen eines Hohlzylinders.\n"
<< "Zuerst berechnen wir das Volumen, \n gib nachfolgend die Werte \n"
<< "der Hoehe h, den Aussenradius R und den Innenradius r ein.";
cout << "\n\n\n";
cout << "Gib jetzt bitte den Wert der Hoehe h \n ein und bestaetige mit Enter.\n";
cin >> h;
cout << "\n\n";
cout << "Gib jetzt bitte den Wert des Aussenradius R \n ein und bestaetige mit Enter.\n";
cin >> R;
cout << "\n\n";
cout << "Gib jetzt noch den Wert des Innenradius r \n ein und bestaetige erneut.\n";
cin >> r;

Hohlzylinder Ergebnisse(R,r,h);
double V = Ergebnisse.Volumen ( ) ;
double M = Ergebnisse.Mantel ( ) ;
double O = Ergebnisse.Oberflaeche ( ) ;

cout << "+++++++++++++++++++++++++++++++++++++++++++";
cout << "\n\n\n";
cout << "Das Volumen des Hohlzylinders betraegt:" << V;
cout << "\n\n";
cout << "Die Mantelflaeche Innen und Aussen betraegt:" << M;
cout << "\n\n";
cout << "Die Oberflaeche des Hohlzylinders betraegt:" << O;
cout << "\n\n\n";
cout << "Gebe nun 0 ein, um von vorne zu beginnen \n oder tippe 2 ein, um das \n Programm zu beenden.\n"; //Entscheidungsmöglichkeit für Anwender Fortsetzen oder Beenden
cout << "+++++++++++++++++++++++++++++++++++++++++++\n";
cin >> integerS;
};
return 0;
}

 
Zuletzt bearbeitet: (Deklaration von integerS vergessen.)

Faralis

Cadet 1st Year
Ersteller dieses Themas
Dabei seit
Apr. 2015
Beiträge
8
Danke erstmal für die schnellen Antworten!

Gib doch mal bitte an, mit welchem Compiler/IDE du arbeitest. Klingt für mich nach MS. Sonst kann man da nicht viel zu sagen.
Bei der Kommentierung würde ich vorschlagen, dass du die Methoden (falls du welche benutzt) kommentierst und sonst logisch zusammenhängende Codeblöcke. Wie du das genau machst, kommt auch auf die IDE an. Ich habe mal mit Doxygen gearbeitet, und das ist schon sehr mächtig.
Ich arbeite mit Microsoft Visual Studio 2013, von Doxygen hab ich gelesen aber nicht wirklich nen Download gefunden :S

Erstmal gibt es float main() afaik nicht (oder haben die das geändert?). Die main() muss immer int sein.
Was das betrifft doch funktioniert ^^

Nächstes Problem: jetzt spuckt er mir die Fehler error LNK1120 und LNK 2019 aus, habe jetzt lediglich R,r,h in den Klammern ergänzt und die Fehler sind ausgemerzt - doch wie umgehe ich jetzt die zwei neuen Fehler?
Ergänzung ()

Ah hab den Fehler gefundene und ausgemerzt :D
Vielen dank für den super Support!
 

Autokiller677

Vice Admiral
Dabei seit
Jan. 2009
Beiträge
6.498
Was hat MS denn da schon wieder verbrochen...

Ansonsten solltest du dir, auch wenn es jetzt läuft, mal anschauen, welche Variable in welchem Scope (mir fehlt gerade das deutsche Wort, sorry) gültig ist, wann man globale Variablen nutzt und wann nicht etc. Denn aktuell ist dein Code etwas durcheinander.
 

Faralis

Cadet 1st Year
Ersteller dieses Themas
Dabei seit
Apr. 2015
Beiträge
8
Ja geb gerne zu, dass das wohl eher eine Holzhacker-Variante ist und ich hab mir extra zu dem Kauderwelsch-Script meines Professors schon ein Buch gekauft und bin eifrig am Lesen, ausprobieren und verstehen - nur wenn ich das Buch mit dem Script vergleiche, müsste ich aufgrund des Scriptes Kreuz und Quer im Buch herumspringen - macht mir noch etwas zu schaffen. :o
 

SimsP

Lt. Junior Grade
Dabei seit
Okt. 2010
Beiträge
426
Autokiller hat recht, float main() ist nicht sinnvoll. Besser int main()
Außerdem macht es nicht unbedingt Sinn für jede Variable gleich double zu nehmen.
Sofern du die Genauigkeit nicht wirklich brauchst nimm lieber float bei Variablen.

Nun zu deiner Frage wie man auf Variablen innerhalb einer Klasse zugreift.
Ich weiß ja nicht wie viel du schon von Objektorietierung weißt, aber nochmal ein kurzer Einstieg.
Bei der Objektorientierung geht es darum die Programmierung so zu gestalten, dass man im Programm selbst einzelne Objekte mit gewissen Eigenschaften und Funktionen, den sogenannten Methoden, erstellen kann.
Das soll es dem Programmierer leichter machen sich auch bei komplexen Programmstrukturen leichter zurecht zu finden, indem er einfach meherere Objekte beschreiben kann, die dann miteinander interagieren können.
Die Klasse ist quasi der Bauplan für eine gewisse Art von Objekten. In deinem Fall von geometrischen Körpern, oder genauer gesagt Hohlzylindern.
Wenn du jetzt eine Klasse als einen Bauplan erstellen willst, musst du dich erst mal fragen "welche Eigenschaften hat mein Hohlzylinder?" und "welche Funktionen soll er mir bieten?" und auf "welche davon will ich von außen zugreifen können?"
Funktionen zB die du aus der main() aufrufen möchtest sollten public sein. Interne Variablen oder Eigenschaften eher private.
Das ganze könnte dann so Aussehen:

Code:
class Hohlzylinder{
private:
...
float volumen;
float radInnen;
...

public:
...
float Hohlzylinder::berechneVolumen(){
...
}
...
}
Wie kann man jetzt auf die Eigenschaften, also die privaten Variablen von außen zugreifen?
Dazu bedient man sich normalerweise eines Konstruktors.
Der Konstruktor ist die Funktion, welche aufgerufen wird, sobald du ein Objekt im Programm erzeugst und hat immer den selben Namen wie die Klasse. Es ist die Funktion, die dir quasi im Programm ein Objekt nach dem Bauplan aus der Klasse erstellt.

In deinem momentanen Code ist der Konstruktor Hohlzylinder() direkt unter public und noch leer.
Wenn du dann in deiner main Funktion Hohlzylinder Ergebnisse; aufrufst, erstellst du genau mit Hilfe von diesem Konstruktor im Programm ein Objekt vom Typ Hohlzylinder mit allen Variablen und Funktionen, die in der Klasse beschrieben sind. Allerdings ist das Objekt noch leer.

Der Trick ist, man kann den Knostruktor wie jede andere Funktion auch überladen. Das bedeutet du kannst eine weitere Funktion Hohlzylinder schreiben, die zB einen Radius als Parameter übergeben bekommt und diesen einer privaten Variable des zu erstellenden Objekts übergibt. Das sieht dann ungefähr so aus:
Code:
class Hohlzylinder{
private:
...
float radiusInnen;
...

public:
Hohlzylinder::Hohlzylinder()
Hohlzylinder::Hohlzylinder(float r){

radiusInnen = r;
}
...
}
Und so der entsprechende Aufruf im Programm:
Code:
int main(){

float r = 25.4f;
Hohlzylinder Zylinder(r);
}
Was ist passiert?
Du hast einen neuen Konstruktor, der eine float Variable entgegennimmt und ein Objekt baut, dessen interne Eigenschaft radiusInnen eben diesen Wert übernimmt.
Du hast jetzt im Programm einen Zylinder mit der Eigenschaft radiusInnen = 25.4f
Jetzt kannst du deinen Konstruktor natürlich so erweitern, dass er auch andere Variablen wie zB die Höhe übernimmt, genau wie bei einer normalen Funktion auch.

Nun solltest du in der Lage sein, dir dein Klasse mit den Variablen selbst zusammenstellen zu können. Stellt sich nur noch die Frage "wie bekomme ich mein Volumen im Programm?"
Die Frage ist nicht ganz unberechtigt, denn private Variablen kannst du nicht aus dem Programm aus aufrufen, doch das ist oft auch so vorgesehen, damit zB nicht aus Versehen irgendwelchen seltsamen Werte übergeben werden.
Allerdings kannst du Funktionen schreiben, die dir den Zugriff auf interne Variablen gestatten.

Willst du zB das Volumen berechnen könntest du eine public: Funktion float Hohlzylinder::Volumen() in der Klasse schreiben, die dir mit den internen Werten das Volumen berechnet und das Ergebnis als float ausgibt. Im Programm könnte der Aufruf dann etwa so aussehen:

Code:
int main(){
...
float volumen = 0.0f;
Hohlzylinder Zylinder(.....);
volumen = Zylinder.Volumen();
...
Ich hoffe ich habe dich nicht zu sehr verwirrt und konnte dir etwas helfen.
Viel Erfolg!
 
Top