Webmaster Forum Logo Part 1 Webmaster Forum Logo Part 2
Webmaster Forum Logo Part 3
     
 
  :: Anmeldung

Benutzername:

Registrierung...

Passwort:

Passwort vergessen?

angemeldet bleiben


  
  :: Umfrage
Welche sozialen Netzwerke benutzt du regelmäßig?

 Facebook
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 73%
 keines
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 22%
 Google+
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 19%
 Twitter
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 11%
 Xing
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 6%
 schülerVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 6%
 meinVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 4%
 studiVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 4%
 MySpace
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 2%
 LinkedIn
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 2%

 ges. 393 Stimmen
 
  :: Buttons

Valid XHTML 1.0 Transitional

dermainzer

Routinier

Dabei seit: 07.03.2009

Beiträge: 327

 

1 Zum Seitenanfang

Dienstag, 21. Juli 2009, 14:43

[C++] Klassendeklarierung falsch?

Hallo,

ich mache grade meine ersten Schritte in C++ und OOP in C++. Ich habe versucht mir eine Taschenrechnerklasse zu programmieren, nachdem ich einen kleinen Taschenrechner auf Konsolenebene in prozeduraler Progrmamierung geschafft habe. Allerdings funktioniert die Klasse nicht. Schon beim Deklarieren in main() kommt der Fehler D:\C++\tr\taschenrechner\main.cpp|8|error: `Taschenrechner' was not declared in this scope|. Ich denke, dass ich es richtig deklariert habe, aber anscheinend ist es doch nicht so...
Hier ist mein Code:

C/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>

using namespace std;

int main()
{

    Taschenrechner tr;

    cout << "Bitte geben Sie die erste Zahl ein:" << endl;
    cin >> tr.zahl1;
    cout << "Bitte geben Sie die zweite Zahl ein:" << endl;
    cin >> tr.zahl2;
    cout << "Bitte geben Sie jetzt den Rechenoperator ein. Zur Verfügung steht: \n * \n / \n + \n -" << endl;
    cin >> tr.op;

    tr.rechne(tr.zahl1, tr.zahl2, tr.op);

    return 0;
}

class Taschenrechner {

    public:
        double zahl1, zahl2;
        char op;


    public void rechne(double zahl1, double zahl2, char op) {

        if(op == '*')
            cout << zahl1 * zahl2 << endl;

        if(op == '/')
            cout << zahl1 / zahl2 << endl;

        if(op == '+')
            cout << zahl1 + zahl2 << endl;

        if(op == '-')
            cout << zahl1 - zahl2 << endl;

    }

};

kann mir bitte jemand helfen und mir den Fehler sagen?


dermainzer

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dermainzer« (21. Juli 2009, 14:43)

 

silence

König

Dabei seit: 28.02.2003

Beiträge: 981

 

2 Zum Seitenanfang

Dienstag, 21. Juli 2009, 20:14

Schreib unter

C/C++-Quelltext

1
using namespace std;

C/C++-Quelltext

1
class Taschenrechner;


Übrigens,

C/C++-Quelltext

1
public void rechne(double zahl1, double zahl2, char op)
ist eher C#/Java.
Da oben bereits public: steht, kannst du also

C/C++-Quelltext

1
void rechne(double zahl1, double zahl2, char op)
schreiben.
Aktuell nutze ich: Windows, Linux, MacOS X, Solaris...weil die Welt nicht nur S/W ist!
Blog
 

ivanhoe

Eroberer

Dabei seit: 09.06.2009

Beiträge: 69

 

3 Zum Seitenanfang

Dienstag, 21. Juli 2009, 20:34

Wenn deine Klassen größer oder mehr werden, bietet es sich auch an die Klassendeklaration in header Dateien auszulagern.
 

dermainzer

Routinier

Dabei seit: 07.03.2009

Beiträge: 327

 

4 Zum Seitenanfang

Dienstag, 21. Juli 2009, 20:39

Hallo silence,

hab gemacht was du gesagt hast. Jetzt kommt der Fehler D:\C++\tr\taschenrechner\main.cpp|9|error: aggregate `Taschenrechner tr' has incomplete type and cannot be defined| hier Taschenrechner tr;.


@ivanhoe: bis es soweit ist, dauert es bestimmt noch etwas^^


wsl
 

ivanhoe

Eroberer

Dabei seit: 09.06.2009

Beiträge: 69

 

5 Zum Seitenanfang

Dienstag, 21. Juli 2009, 20:59

Die Vorwärtsdeklaration von Taschenrechner reicht hier nicht, weil du in main ja gleich ein Objekt davon erzeugst. Also musst du die Klasse Taschenrechner komplett deklarieren, bevor du sie in main verwenden kannst.

Edit: Die Vorwärtsdeklaration wäre hier mit einem Zeiger möglich, was allerdings nur etwas bringt, wenn man die Klassendeklaration in eine header Datei auslagert ;)

Ein Beispiel dazu:

Da dir die Vorwärtsdeklarartion in der main nix bringt, wird eine zusätzliche Klasse Benutzeraktion erstellt. Von welcher in main ein Objekt erstellt wird.
main.cpp

C/C++-Quelltext

1
2
3
4
5
6
7
8
#include <stdio.h>
#include "Benutzeraktion.h"

int main()
{
  Benutzeraktion Aktion;
  Aktion.ichWillRechnen();
}


In der header Datei der Benutzeraktion Klasse kann dann Taschenrechner vorwärtsdeklariert werden, weil im header davon nur ein Zeiger erstellt wird,
Benutzeraktion.h

C/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
#ifndef BENUTZERAKTION_H
#define BENUTZERAKTION_H

class Taschenrechner;

class Benutzeraktion
{
		public:
		  void ichWillRechnen();
		  Taschenrechner *tr;
};

#endif


Die Funktionsdeklaration findet dann getrennt statt und dort braucht auch erst die Klasse Taschenrechner deklariert werden bzw wie hier inkludiert.
Benutzeraktion.cpp

C/C++-Quelltext

1
2
3
4
5
6
7
8
#include "Benutzeraktion.h"
#include "Taschenrechner.h"

void Benutzeraktion::ichWillRechnen()
{
	  tr = new Taschenrechner();
	  tr->rechne();
}


Taschenrechner.h

C/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
#ifndef TASCHENRECHNER_H
#define TASCHENRECHNER_H

class Taschenrechner
{
	public:
		double zahl1, zahl2;
		char op;
		void rechne();
};

#endif


Taschenrechner.cpp

C/C++-Quelltext

1
2
3
4
5
6
7
#include "Taschenrechner.h"
#include <stdio.h>

void Taschenrechner::rechne()
{
	printf("Taschenrechner rechnet");
}


Mir ist klar, dass das nicht wirklich dein Problem war und der Nutzen der Vorwärtsdeklaration, nämlich der der kürzeren Komplierzeit, in diesem Beispiel nicht zum tragen kommt, aber mir war gerade danach :D

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »ivanhoe« (21. Juli 2009, 21:59)

 

cccpmik

Foren Gott

Dabei seit: 04.09.2007

Beiträge: 2 998

 

6 Zum Seitenanfang

Dienstag, 21. Juli 2009, 20:59

hi meinzer. ich habe mal vor 3 jahren in der schule ein kleine c++ schulprojekt geschrieben zum thema vererbung und OOP. ich poste mal den quellcode aber viel kann ich dir nicht dazu sagen schaue es dir mal an. MFG

header.h (klassen deklaration)

  Spoiler Spoiler

C/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
class volumen
{
protected:
   double a;
public:
   volumen(double);
};
//############################################
class pyramide:public volumen
{
private:
   double h;
   double volumen_p;
public:
   void berechne_vp(double,double);
   double zeige_vp(void);
   pyramide(double,double);
};
//############################################
class wuerfel:public volumen
{
protected:
   double volumen_w;
public:
   void berechne_vw(double);
   double zeige_vw(void);
   wuerfel(double);
};
//############################################
class quader:public wuerfel
{
private:
   double h;
   double b;
   double volumen_q;
public:
   void berechne_vq(double,double,double);
   double zeige_vq(void);
   quader(double,double,double);
};
//############################################
class flaeche
{
protected:
   double a;
public:
   flaeche(double);
};
//############################################
class dreieck:public flaeche
{
private:
   double h;
   double flaeche_d;
public:
   void berechne_fd(double,double);
   double zeige_fd(void);
   dreieck(double,double);
};
//############################################
class quadrat:public flaeche
{
protected:
   double flaeche_q;
public:
   void berechne_fq(double);
   double zeige_fq(void);
   quadrat(double);
};
//############################################
class rechteck:public quadrat
{
private:
   double b;
   double h;
   double flaeche_r;
public:
   void berechne_fr(double,double,double);
   double zeige_fr(void);
   rechteck(double,double,double);
};


die einzelnen klassen mit methoden

flaeche.cpp

  Spoiler Spoiler

C/C++-Quelltext

1
2
3
4
5
6
#include "header.h"

flaeche::flaeche(double lv_a)
{
   a = lv_a;
}


dreieck.cpp

  Spoiler Spoiler

C/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "header.h"
   
void dreieck::berechne_fd(double lv_a,double lv_h)
{
   a = lv_a;
   h = lv_h;
   flaeche_d = (a*h)/2;
}
double dreieck::zeige_fd(void)
{
   return flaeche_d;
}
dreieck::dreieck(double lv_a,double lv_h):flaeche(lv_a)
{
   a = lv_a;
   h = lv_h;
}


quadrat.cpp

  Spoiler Spoiler

C/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "header.h"

void quadrat::berechne_fq(double lv_a)
{
   a = lv_a;
   flaeche_q = a*a;
}
double quadrat::zeige_fq()
{
   return flaeche_q;
}
quadrat::quadrat(double lv_a):flaeche(lv_a)
{
   a = lv_a;
}


rechteck.cpp

  Spoiler Spoiler

C/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "header.h"

void rechteck::berechne_fr(double lv_a,double lv_b,double lv_h)
{
   a = lv_a;
   b = lv_b;
   h = lv_h;
   flaeche_r = (a*b)*h;
}
double rechteck::zeige_fr()
{
   return flaeche_r;
}
rechteck::rechteck(double lv_a,double lv_b,double lv_h):quadrat(lv_a)
{
   a = lv_a;
   b = lv_b;
   h = lv_h;
}


volumen.cpp

  Spoiler Spoiler

C/C++-Quelltext

1
2
3
4
5
6
#include "header.h"

volumen::volumen(double lv_a)
{
   a = lv_a;
}


pyramide.cpp

  Spoiler Spoiler

C/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "header.h"

void pyramide::berechne_vp(double lv_a,double lv_h)
{
   a = lv_a;
   h = lv_h;
   volumen_p = ((a*a)*h)/3;
}
double pyramide::zeige_vp()
{
   return volumen_p;
}
pyramide::pyramide(double lv_a,double lv_h):volumen(lv_a)
{
   a = lv_a;
   h = lv_h;
}


quadrat.cpp

  Spoiler Spoiler

C/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "header.h"

void quadrat::berechne_fq(double lv_a)
{
   a = lv_a;
   flaeche_q = a*a;
}
double quadrat::zeige_fq()
{
   return flaeche_q;
}
quadrat::quadrat(double lv_a):flaeche(lv_a)
{
   a = lv_a;
}


quader.cpp

  Spoiler Spoiler

C/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "header.h"

void quader::berechne_vq(double lv_a,double lv_b,double lv_h)
{
   a = lv_a;
   b = lv_b;
   h = lv_h;
   volumen_q = (a*b)*h;
}
double quader::zeige_vq()
{
   return volumen_q;
}
quader::quader(double lv_a,double lv_b,double lv_h):wuerfel(lv_a)
{
   a = lv_a;
   b = lv_b;
   h = lv_h;
}


und die main.cpp welche die klassen verwendet

  Spoiler Spoiler

C/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include <afx.h>
#include <iostream.h>
#include "header.h"

void main()
{
double a,b,h;
char s,w;

dreieck fd(0,0);
quadrat fq(0);
rechteck fr(0,0,0);
pyramide vp(0,0);
wuerfel vw(0);
quader vq(0,0,0);

do
{
cout << "+++++++++++++++++++Menue+++++++++++++++++++++" << endl;
cout << "+ Flaecheninhalt berechnen von einem...     +" << endl;
cout << "+ Dreieck  ... 1 druecken                   +" << endl;
cout << "+ Quadrat  ... 2 druecken                   +" << endl;
cout << "+ Rechteck ... 3 druecken                   +" << endl;
cout << "+-------------------------------------------+" << endl;
cout << "+ Volumen berechnen von einem/er...         +" << endl;
cout << "+ Pyramide ... 4 druecken                   +" << endl;
cout << "+ Wuerfel  ... 5 druecken                   +" << endl;
cout << "+ Quader   ... 6 druecken                   +" << endl;
cout << "+-------------------------------------------+" << endl;
cout << "+ Beenden mit einer beliebigen Taste        +" << endl;
cout << "+++++++++++++++++++++++++++++++++++++++++++++" << endl<<endl;

cout << "Ihre Wahl: ";
cin >> w;

   switch(w)
   {
   case '1':
      {         
         cout <<"---Flaecheninhalt Berechnung eines Dreiecks--"<< endl;
         cout <<" Bitte die Grundlinie eingeben: ";
         cin >> a;
         cout <<" Bitte die Hoehe eingeben: ";
         cin >> h;
         fd.berechne_fd(a,h);
         cout <<" Der Flaecheninhalt des Dreiecks betraegt: "<< fd.zeige_fd() << endl;
         cout <<"---------------------------------------------"<<endl;
         cout << endl;
         break;
      }
   case '2':
      {         
         cout <<"---Flaecheninhalt Berechnung eines Quadrats--"<< endl;
         cout <<" Bitte die Breite eingeben: ";
         cin >> a;
         fq.berechne_fq(a);
         cout <<" Der Flaecheninhalt des Quadrats betraegt: "<< fq.zeige_fq() << endl;
         cout <<"---------------------------------------------"<<endl;
         cout << endl;
         break;
      }
   case '3':
      {         
         cout <<"---Flaecheninhalt Berechnung eines Rechecks--"<< endl;
         cout <<" Bitte die Laenge eingeben: ";
         cin >> a;
         cout <<" Bitte die Breite eingeben: ";
         cin >> b;
         cout <<" Bitte die Hoehe eingeben: ";
         cin >> h;
         fr.berechne_fr(a,b,h);
         cout <<" Das Volumen des Rechtecks betraegt: "<< fr.zeige_fr() << endl;
         cout <<"---------------------------------------------"<<endl;
         cout << endl;
         break;
      }
   case '4':
      {         
         cout <<"------Volumen Berechnung einer Pyramide------"<< endl;
         cout <<" Bitte die Grundlinie eingeben: ";
         cin >> a;
         cout <<" Bitte die Hoehe eingeben: ";
         cin >> h;
         vp.berechne_vp(a,h);
         cout <<" Das Volumen der Pyramide betraegt: "<< vp.zeige_vp() << endl;
         cout <<"---------------------------------------------"<<endl;
         cout << endl;
         break;
      }
   case '5':
      {         
         cout <<"------Volumen Berechnung eines Wuerfels------"<< endl;
         cout <<" Bitte die Breite eingeben: ";
         cin >> a;
         vw.berechne_vw(a);
         cout <<" Das Volumen des Wuerfels betraegt: "<< vw.zeige_vw() << endl;
         cout <<"---------------------------------------------"<<endl;
         cout << endl;
         break;
      }
   case '6':
      {         
         cout <<"------Volumen Berechnung eines Quaders-------"<< endl;
         cout <<" Bitte die Laenge eingeben: ";
         cin >> a;
         cout <<" Bitte die Breite eingeben: ";
         cin >> b;
         cout <<" Bitte die Hoehe eingeben: ";
         cin >> h;
         vq.berechne_vq(a,b,h);
         cout <<" Das Volumen des Quaders betraegt: "<< vq.zeige_vq() << endl;
         cout <<"---------------------------------------------"<<endl;
         cout << endl;
         break;
      }
   default:
      {
      cout << "Bitte eine Zahl zwischen 1 und 6 eingeben! " << endl;
      }
   }
cout << "Programm wiederholen? dann j oder J eingeben : ";
cin >> s;
cout << endl<<endl;
}while(s == 'j' || s == 'J');
cout << "Vielen Dank fuer die Nutzung des Programms!"<< endl;
cout << "Bei Fehlern oder Fragen koennen wir nichts dafuer:P" << endl;
cout << endl<<endl;
}


also wenn du fragen hast dann frag soweit ich mich noch dran erinnern kann, kann ich dir das eine oder andere erzählen aber ich hoffe dieses beispiel hilft dir vorerst weiter

MFG
Mein kleines Projekt
-Cruel Online-
 

silence

König

Dabei seit: 28.02.2003

Beiträge: 981

 

7 Zum Seitenanfang

Mittwoch, 22. Juli 2009, 00:21

@ivanhoe: Du hast natürlich recht, eine Vorwärtsdeklaration funktioniert hier tatsächlich nicht.

@thread: Schreib einfach die main() unter deine Klassendeklaration, damit sollte es builden. Wenn deine erste Klasse dann läuft, solltest du wie ivanhoe bereits sagte anfangen deine Klasse in einen Deklarations- und einen Implementationsteil zu zerlegen und in eigene Dateien auslagern.

Offtopic: Ich glaube der Thread ist beispielhaft für die Probleme von WMW: Der Threadsteller hat eine konkrete Frage und ein Problem, was aber als Antwort gepostet wird hilft ihm nicht weiter: ivanhoe erklärt das Problem korrekt, die angebotene Lösung ist aber umständlich und für einen Anfänger wohl auch erstmal nicht nachvollziehbar. Und cccpmiks Post ist meiner Meinung nach einfach nur noch offtopic, sollen wir jetzt anfangen auf Fragen wie "wie kann ich eine Datei öffnen" den Quellcode der STL posten?
Aktuell nutze ich: Windows, Linux, MacOS X, Solaris...weil die Welt nicht nur S/W ist!
Blog
 

cccpmik

Foren Gott

Dabei seit: 04.09.2007

Beiträge: 2 998

 

8 Zum Seitenanfang

Mittwoch, 22. Juli 2009, 07:20

naja ich wollte einfach nur helfen da ich ja schon bereits ein taschenrechner programmiert habe. da ich selber alles nur von code snippets gelern habe, dachte ich es wird weiterhelfen vor allem dass dermeinzer bestimmt früher oder später noch zusätzlich das kapitel vererbung durchgehen wird. naja gut die admins können es ja löschen

MFG
Mein kleines Projekt
-Cruel Online-
 

dermainzer

Routinier

Dabei seit: 07.03.2009

Beiträge: 327

 

9 Zum Seitenanfang

Mittwoch, 22. Juli 2009, 14:23

Hallo,

mit dem main() unter die Klasse schreiben hat es funktioniert. Vielen Dank.

Zitat

Offtopic: Ich glaube der Thread ist beispielhaft für die Probleme von WMW: Der Threadsteller hat eine konkrete Frage und ein Problem, was aber als Antwort gepostet wird hilft ihm nicht weiter: ivanhoe erklärt das Problem korrekt, die angebotene Lösung ist aber umständlich und für einen Anfänger wohl auch erstmal nicht nachvollziehbar. Und cccpmiks Post ist meiner Meinung nach einfach nur noch offtopic, sollen wir jetzt anfangen auf Fragen wie "wie kann ich eine Datei öffnen" den Quellcode der STL posten?

stimmt, davon, was ivanhoe gepostet hat, versteht ich nur ein bisschen, da ich so tief noch nicht in die Materie eingestiegen bin. cccpmiks Post kann ich später bestimmt mal brauchen, weil ich auch noch die Vererbung durchgehen werde, aber im Moment verwirrt es mich eher ein bisschen.

Also vielen Dank für eure Hilfe nochmal.


dermainzer
 

ivanhoe

Eroberer

Dabei seit: 09.06.2009

Beiträge: 69

 

10 Zum Seitenanfang

Mittwoch, 22. Juli 2009, 20:03

Zitat


Offtopic: Ich glaube der Thread ist beispielhaft für die Probleme von WMW: Der Threadsteller hat eine konkrete Frage und ein Problem, was aber als Antwort gepostet wird hilft ihm nicht weiter: ivanhoe erklärt das Problem korrekt, die angebotene Lösung ist aber umständlich und für einen Anfänger wohl auch erstmal nicht nachvollziehbar. Und cccpmiks Post ist meiner Meinung nach einfach nur noch offtopic, sollen wir jetzt anfangen auf Fragen wie "wie kann ich eine Datei öffnen" den Quellcode der STL posten?

Möchte dazu auch kurz noch etwas sagen, du hast recht, dass mein Beispiel umständlich ist, aber es war nicht als Lösung gedacht, sondern einfach dazu die Vorwärtsdeklaration etwas zu erklären. Die Lösung des konkreten Problems schrieb ich zu Anfang des Posts und erweiterte es später um das Beispiel zur Vorwärtsdeklaration.
Ich persönlich finde es nicht verkehrt wenn man in einem bestimmten Bereich ein Problem hat und dazu (neben der Lösung des Problems) auch noch Hintergundinformationen oder Tipps bekommt, wie man etwas anders (vielleicht besser) machen kann.
Nun ja, das ist aber nur meine Meinung und ich werden demnächst zwei mal überlegen, bevor ich ungefragt Informationen poste.
 

Ähnliche Themen