Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Funktionszeiger in Klasse

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
05.07.2006, 09:46 Uhr
WindDancer1



Hallo Leute ,

ich hab hier ein riessen Prob mit Funktionszeigern in einer Klasse.
Bevor ich losleg wollte ich noch sagen, dass mir der Sinn bzw. der Unsinn meines kleinen Progs schon klar ist, ich weiss auch dass ich auf ganz anderem Wege zum Ziel kommen könnte aber der Code dient einzig und allein zum lernen !.

Als erses hab ich einnkleines Prog ohne Klassen mit einem Funktionszeiger gebastelt, welches auch wunder bar funktioniert :leak: .
Man muss der Fnkt berechne nur 3 Parameter übergeben 2 Integers zum rechnen und das was damit gemacht werden soll (addieren, multiplizieren ...),
int(*waehle)(int, int) ist der Fnkt-Zeiger der dann auf die auszuführende Fnkt zeigt !

Hier mal der funktionierende Code:


C++:
#include <iostream>

using namespace std;



    int berechne(int a, int b, int(*waehle)(int, int));
    
    int addiere(int a, int b);
    int multipliziere(int a, int b);
    int subtrahiere(int a, int b);


void main()
{
    

    int Z;
    int Y;
    int X;

    X = berechne(10, 10,multipliziere);
    cout << "Das Ergebnis der Multiplikation ist :    " << X << endl << endl << endl;

    Y = berechne(20, 10, subtrahiere);
    cout << "Das Ergebnis der Subtraktion ist :    " << Y << endl << endl << endl;

    Z = berechne(20, 10, addiere);
    cout << "Das Ergebnis der Addition ist :        " << Z << endl << endl << endl;

}



int addiere(int a, int b)
{
    return a + b;
}

int multipliziere(int a, int b)
{
    return a * b;
}

int subtrahiere(int a, int b)
{
    return a - b;
}

int berechne(int a, int b, int(*waehle)(int a, int b))
{
    return waehle(a, b);
}
    



So jetzt hab ich versucht das ganze in ne Klasse zu werfen.
Das Funktioniert leider nicht , ich bekomme folgenden Fehler :
:die: error C2065: 'multipliziere' : nichtdeklarierter Bezeichner :die:

Hier der Code:

C++:
#include <iostream>

using namespace std;


class cTest
{
    public:

        cTest() {}
        ~cTest(){}


        int addiere(int a, int b)
        {
            return a + b;
        }
        
        int multipliziere(int a, int b)
        {
            return a * b;
        }
        
        int subtrahiere(int a, int b)
        {
            return a - b;
        }    

        
        int berechne(int a, int b, int(*waehle)(int a, int b))
        {
            return waehle(a, b);
        }

};



void main()
{
    cTest objTest;
    
//    
//     int Z;
//     int Y;    
//    
//     Y = berechne(20, 10, subtrahiere);
//     cout << "Das Ergebnis der Subtraktion ist :    " << Y << endl << endl << endl;
//    
//     Z = berechne(20, 10, addiere);
//     cout << "Das Ergebnis der Addition ist :        " << Z << endl << endl << endl;

    int X;
    X = objTest.berechne(10, 10,multipliziere);
    cout << "Das Ergebnis der Multiplikation ist :    " << X << endl << endl << endl;
}





Was ich mir unter Anderem überlegt habe ist : Die Klasse enthält einen Zeiger,
also muss ich eine tiefe Kopier machen :confused: ???
Wenn ja wie :confused: ?
Bzw. wie krieg ich den Code mit der Klasse überhaupt zum laufen :confused: ?
Bitte helft mir, mir raucht echt der Kopf :eek: !

Vielen Dank schon mal für eure Mühe
Shadow Eater
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
05.07.2006, 10:01 Uhr
ao

(Operator)


So gehts. Für die Erklärung hab ich gerade keine Zeit.

C++:
#include <iostream>

using namespace std;


class cTest
{
    public:

        cTest() {}
        ~cTest(){}


        static int addiere(int a, int b)
        {
            return a + b;
        }

        static int multipliziere(int a, int b)
        {
            return a * b;
        }

        static int subtrahiere(int a, int b)
        {
            return a - b;
        }


        int berechne(int a, int b, int(*waehle)(int a, int b))
        {
            return waehle(a, b);
        }

};



void main()
{
    cTest objTest;

//
//     int Z;
//     int Y;
//
//     Y = berechne(20, 10, subtrahiere);
//     cout << "Das Ergebnis der Subtraktion ist :    " << Y << endl << endl << endl;
//
//     Z = berechne(20, 10, addiere);
//     cout << "Das Ergebnis der Addition ist :        " << Z << endl << endl << endl;

    int X;
    X = objTest.berechne(10, 10,cTest::multipliziere);
    cout << "Das Ergebnis der Multiplikation ist :    " << X << endl << endl << endl;
}


ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
05.07.2006, 10:27 Uhr
~WindDancer1
Gast


Danke ao für die schnelle Antwort !

Wenn Du Zeit hast kannst Du ne kleine Erklärung nachliefern ?

Ich verstehe nicht so ganz warum ich nochmal explizit darauf hinweisen muss, dass multipliziere aus cTest kommt(cTest::multipliziere) ich hab doch mein Objekt objTest vom Typ cTest bekannt gemacht (cTest objTest) und berechne ist doch Memberfunktion

Bye,
ShadowEater
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
05.07.2006, 10:58 Uhr
Th



Weil die Parameter unabhängig vom Funktionsaufruf sind.
Bei

C++:
int main()  // <- es heißt "int main()" !!!
{
  cTest objTest;
  int x=10;
  int y=10;
  objTest.berechne(x, y, cTest::multipliziere);
}


wird ja auch nicht überprüft, ob x oder y in cTest enthalten sind.

Nur wenn du innerhalb von Klassen-Methoden auf Member (Variablen oder Methoden) zugreifst, brauchst du nicht "this->" davorschreiben (kannst es aber).

Eine Ausnahme gibt es für "namespaces", das sogenannte Koenig-Lookup (aber das ist wohl noch zu hoch für dich -)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
05.07.2006, 12:30 Uhr
~winddancer 1
Gast


Hi ich bins nochmal ,

danke ao umd Th :live: für eure Hilfe :live: , damit ihr seht dass es nicht vergebens war hier nochmal der Code funktionierend :

Es werden 2 ints verglichen : ist a > b ==< subtrahiere , ist a < b ==> addiere und sind se == dann multipliziere. Die Auswahl läuft über nen Funktionszeiger
Vielleicht könnt ihrs als irgendwie gebrauchen als Anschauungsmaterial oder so ;-) :
C/C++ Code:
#include <iostream>

using namespace std;


class cTest
{
public:

cTest() {}
~cTest(){}

static int addiere(int a, int b)
{
return a + b;
}

static int multipliziere(int a, int b)
{
return a * b;
}

static int subtrahiere(int a, int b)
{
return a - b;
}


static berechne(int a, int b, int(*waehle)(int a, int b))
{
return waehle(a, b);
}

static checkInput(int a, int b)
{

if ( a > b)
{
cout << berechne(a, b, subtrahiere)<< endl << endl;
}

if ( a < b)
{
cout << berechne(a, b, addiere)<< endl << endl << endl;
}
if (a == b)
{
cout << berechne(a, b, multipliziere)<< endl << endl;
}


}

};






P.S.: Kann ich den If....... teil über ne geschickte switch Anweisung besser formulieren ?

Bye
ShadowEater
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
05.07.2006, 13:22 Uhr
ao

(Operator)



Zitat von ~winddancer 1:
P.S.: Kann ich den If....... teil über ne geschickte switch Anweisung besser formulieren ?

Nein, nur über if () ... else if () ... else ...

ao
 
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: