Frage zu Function Point...



  • Hi, ich moechte ein klein Program schreiben, um die Erkennis von Function Point zu ueben. Folgend ist mein Code:

    #include<iostream.h>
    
    class testClass{
    
    private:
    	void show1(int num) {cout << "show1 num=" << num << endl;}
    	void show2(int num) {cout << "show2 num=" << num << endl;}
    	void show3(int num) {cout << "show3 num=" << num << endl;}
    	void (*fptr[3])(int);
    public:
    	void show(int which, int num);
    	testClass();
    };
    
    void testClass::show(int which, int num){
    
    	*fptr[which-1](int num);        // Hier wird einen Fehler angemeldet.
    }
    
    testClass::testClass(){
    
    	fptr[0] = &show1;               // Hier sind anderen drei Fehler.
    	fptr[1] = &show2;
    	fptr[2] = &show3;
    }
    
    void main(){
    
    	int select, num;
    	testClass myObject;
    
    	cout << "select a fuction (1-3) and a number." << endl;
    	cin >> select;
    	cin >> num;
    	myObject.show(select, num);
    
    	cin >> select;    // wait for the result
    }
    

    Wechle Fehler habe ich macht? 😮
    Danke schoen! 🙂



  • Schau mal in die FAQ.
    Funktionspointer zeigen auf Funktionen,
    Funktionen innerhalb von Klassen jedoch nennt man Methoden.
    Da ist dann ein kleiner Workaround nötig, um diese dann
    über Methodenzeiger aufzurufen.



  • und ausserdem, funktionspointer unter C++ sind mit bedacht zu verwenden ...

    Besser uebersichtlicher und damit einfacher handhabbar sind virtuelle Methoden ...

    nich getestet :

    Class IFunction
    {
    public:
        virtual ~IFunction(){}
        virtual void Process(int num) = 0;    
    };
    
    class Show1 : public IFunction
    {
    public: 
        Show1(){}
        virtual ~Show1(){}
        virtual void Process(int num)
        {
            std::cout << "show1 num=" << num << std::endl;
        }
    };
    
    class Show2 : public IFunction
    {
    public: 
        Show2(){}
        virtual ~Show2(){}
        virtual void Process(int num)
        {
            std::cout << "show2 num=" << num << std::endl;
        }
    };
    
    class Show3 : public IFunction
    {
    public: 
        Show3(){}
        virtual ~Show3(){}
        virtual void Process(int num)
        {
            std::cout << "show3 num=" << num << std::endl;
        }
    };
    
    class TestClass
    {
    public:
        TestClass():mMapper(3,NULL) // gleich mit 3 Null Zeigern initialisieren 
        {
            // funktionen im Mapper belegen 
            mMapper[0] = &mshow1;
            mMapper[1] = &mshow2;
            mMapper[2] = &mshow3;
        }
        virtual ~TestClass()
        {
        }
        void show(int which, int num)
        {
            // unabgesichert ! 
            mMapper[which]->Process(num);
        }
    private:
        // vir erzeugen die Objecte mal statisch 
        // koennte man auch besser dynamisch ueber ne objectfabrik machen .... 
        Show1 mshow1;
        Show2 mshow2;
        Show2 mshow3;
    
        // und natuerlich der Mapper als vector
        // spaeter koennt man das noch dynamischer ausbauen mit ner map etc ... 
        // vector statt statischem Array, weil das initialisieren besser geht ... und die Allokation-geschwindigkeit beim einmaligen anlegen nich so die rolle spielt
        std::vector<IFunction *> mMapper;
    };
    

    Faend ich besser lesbar und vor allem auch erweiterbarer ...
    Gibt aber auch viele C-Juengerer in der C++ Welt, denen an der stelle der Aufwand, die 4 zusaetzlichen klassen zu schreiben, zu hoch ist ...
    Im binaercode duerfter der aufwand relativ gleich sein ...

    Ciao ...



  • Danke schoen! 👍


Anmelden zum Antworten