Forum: PC-Programmierung C++ Einstiegsprogramm(C2352)


von pspracers (Gast)


Lesenswert?

Hallo,

Ich habe ein Problem mit meinem C++ Einstiegsprogramm, es sollte ein 
Einführungsbeispiel für Polymorphie sein, gibt mir aber den Fehler:
(die Fehler):
Fehler  1  error C2352: 'CInstrument::Spielen': Unzulässiger Aufruf 
einer nicht statischen Memberfunktion  c:\users\markus\documents\visual 
studio 2008\projects\polymorphie\main.cpp  11
Fehler  3  error C2352: 'CInstrument::Stimmen': Unzulässiger Aufruf 
einer nicht statischen Memberfunktion  c:\users\markus\documents\visual 
studio 2008\projects\polymorphie\main.cpp  14
Fehler  2  error C2352: 'CSchlagzeug::Spielen': Unzulässiger Aufruf 
einer nicht statischen Memberfunktion  c:\users\markus\documents\visual 
studio 2008\projects\polymorphie\main.cpp  12

main.cpp
1
#include <conio.h>
2
#include <stdio.h>
3
#include "polymorphie.h"
4
5
#pragma warning(disable:4996)
6
7
void main()
8
{
9
  CSchlagzeug o;
10
11
  CInstrument::Spielen(1);
12
  CSchlagzeug::Spielen(2);
13
  
14
  CInstrument::Stimmen(o);
15
  getch();
16
}

polymorphie.h
1
#pragma once
2
3
class CInstrument
4
{
5
public:
6
  void Spielen(int note);
7
  void Stimmen(CInstrument& Instrument);
8
9
};
10
11
class CSchlagzeug : public CInstrument
12
{
13
public:
14
  void Spielen(int note);
15
};

polymorphie.cpp
1
#include <conio.h>
2
#include <stdio.h>
3
#include "polymorphie.h"
4
5
void CInstrument::Spielen(int note)
6
{
7
  printf("Instrument speilt %d\n", note);
8
}
9
10
void CSchlagzeug::Spielen(int note)
11
{
12
  printf("Schlagzeug spielt %d\n", note);
13
}
14
15
void CInstrument::Stimmen(CInstrument& Instrument)
16
{
17
  Instrument.Spielen(3);
18
}

hab schon mein Skriptum durch und C++ von A bis Z überfolgen(für mehr 
hab ich leider keine Zeit mehr) und leider keine Antwort für diese 
Fehler bekommen :/ Hab da morgen leider einer sehr sehr wichtige Prüfung 
drüber.

Hoffe mir kann da noch einer Helfen :)

lg

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Der Fehler steht da doch, sogar auf Deutsch:

Du versuchst eine nichtstatische Memberfunktion einer Klasse aufzurufen.

Wenn Du aber eine Funktion ohne ein Objekt einer Klasse aufrufen 
willst, dann muss diese statisch sein.

Und genau das --das Aufrufen von Funktionen ohne einem Objekt-- machst 
Du. Gleich dreimal.

von Karl H. (kbuchegg)


Lesenswert?

pspracers schrieb:

> void main()
> {
>   CSchlagzeug o;
>
>   CInstrument::Spielen(1);
>   CSchlagzeug::Spielen(2);

du kannst die Funktion nicht so aufrufen.
Das ist eine Member Funktion eines Objektes. Du brauchst also ein Objekt 
um darauf die Funktion aufzurufen.

    o.Spielen(1);

Aber: Das ist nicht anders als bei anderen Funktionsaufrufen. Bist du 
sicher, dass du soweit bist, dich an das Konzept der Polymorphie zu 
wagen?
Denn dazu brauchst du dann ein paar Zutaten mehr - namentlich Referenzen 
oder Pointer und vor allen Dingen das Schlüsselwort volatile.

von pspracers (Gast)


Lesenswert?

schonmal danke für die Antworten :)

ob ich dazu schon bereit bin, ist ja nicht meine Entscheidung :/ das 
machen sich ja die Lehrer aus, bzw. die machens wie es im Lehrplan steht 
:/
Hab jetzt das 3. Schuljahr reines C durch, nur sobald da OOP 
dazukommt(seit diesem Schuljahr) komm ich nicht mehr ganz klar damit :/

von Markus M. (mark_m)


Lesenswert?

@Karl Heinz Buchegger
> … und vor allen Dingen das Schlüsselwort volatile.
Ich bin neugierig und würde gerne deine Erklärung zu dieser Aussage 
lesen.

Grüsse

von Karl H. (kbuchegg)


Lesenswert?

Markus M. schrieb:
> @Karl Heinz Buchegger
>> … und vor allen Dingen das Schlüsselwort volatile.
> Ich bin neugierig und würde gerne deine Erklärung zu dieser Aussage
> lesen.

:-)
Du hast recht. Ich bin schon zu lange bei den µC :-)
Ich meinte natürlich virtual und nicht volatile.
(Fängt auch mit v an)

Also 2 Dinge braucht der Mann
* Pointer oder Referenzen
* virtuelle Funktionen

Dann klappts auch mit der Polymorphie.

von Markus M. (mark_m)


Lesenswert?

Puuuuh,

da bin ich aber ruhigt. Ich hatte Skrupel dich, als ausgewiesenen 
Fachmann, der Falschaussage zu bezichtigen.
:-)

Grüsse

von Karl H. (kbuchegg)


Lesenswert?

Markus M. schrieb:
> Puuuuh,
>
> da bin ich aber ruhigt. Ich hatte Skrupel, dich als ausgewiesenen
> Fachmann, der Falschaussage zu bezichtigen.

Passt schon. Wenn ich Blödsinn tippe, dann sags ruhig. Wenn ich dir 
zustimme, dann bedanke ich mich im Regelfall für die Korrektur.

(Und in dem Fall war das ja wirklich Unsinn. War zwar ein Versehen, aber 
Unsinn bleibt Unsinn)

von pspracers (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Also 2 Dinge braucht der Mann
> * virtuelle Funktionen

Dankeschön, jetzt kenn ich mich auch aus, was mit dem Text gemeint war 
;)
Hab mir jetzt noch ein paar Übungsaufgaben gestellt, und sollte jetzt 
für den Test morgen bestens gerüstet sein :)

von Karl H. (kbuchegg)


Lesenswert?

pspracers schrieb:
> Karl Heinz Buchegger schrieb:
>> Also 2 Dinge braucht der Mann
>> * virtuelle Funktionen
>
> Dankeschön, jetzt kenn ich mich auch aus, was mit dem Text gemeint war
> ;)
> Hab mir jetzt noch ein paar Übungsaufgaben gestellt, und sollte jetzt
> für den Test morgen bestens gerüstet sein :)


Zeig mal.

Denn mit dem Beispiel da oben (nachdem die Syntaxfehler korrigiert 
wurden), kriegst du zwar das erwartete Ergebnis. Aber der Grund dafür 
ist nicht Polymorphie.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.