Aufrufoperator () überladen



  • Hi, ich habe folgendes Problem:
    Ich will über einen Aufrufoperator auf meine Matrizen zugreifen.
    So siehts bei mir bis jetzt aus:

    class Test
    {
    private:
    	double **m1;	//Matrix 1
    	double **m2;	//Matrix 2
    public:
          int operator()(int a, int b);	    //Aufrufoperator
    
          ....
    };
    
    int Test::operator()(int a,int b)
    {
          return m1[a][b];
    };
    
    void main()
    {
          Test t;
    	cout<<t(0,1)<<endl;
    };
    

    Wenn ich es allerdings so mache, kann ich ja bloß auf m1 zugreifen, und nicht mit dem überladenen Operator auf m2!!!! 😕

    Ich hoffe es ist einigermaßen verständlich, was mein Problem ist!



  • Du könntest dem Operator z.B. noch einen dritten Parameter geben, aus dem du die auszugebende Matrix ermittelst:

    int Test::operator()(int a,int b,bool snd=false)
    {
      if(!snd)
        return m1[a][b];
      else
        return m2[a][b];
    }
    
    ...
    
    Test t;
    cout<<"m1:"<<t(1,0)<<endl;
    cout<<"m2:"<<t(1,0,true)<<endl;
    

    (alternativ kannst du auch aus a und/oder b berechnen, aus welcher Matrix die angeforderten Daten stammen könnten)



  • class Test
    {
    private:
        double **m1;    //Matrix 1
        double **m2;    //Matrix 2
    public:
          static const int M1 = 1;
          static const int M2 = 2;
          int operator()(int dummy, int a, int b);        //Aufrufoperator
    
          ....
    };
    int Test::M1;
    int Text::M2;
    
    int Test::operator()(int dummy, int a,int b)
    {
       if( dummy == 1 )
          return m1[a][b];
       if( dummy == 2 )
          return m2[a][b]
    };
    
    void main()
    {
          Test t;
        cout<<t(Test::M2,0,1)<<endl;
    };
    


  • Mmmhhhh - so hab ich mir es auch schon überlegt, ich dachte es gibt eine "bessere" Möglichkeit!

    Danke!



  • CStoll (off) schrieb:

    Du könntest dem Operator z.B. noch einen dritten Parameter geben, aus dem du die auszugebende Matrix ermittelst:

    int Test::operator()(int a,int b,bool snd=false)
    {
      if(!snd)
        return m1[a];
      else
        return m2[a][b];
    }
    
    ...
    
    Test t;
    cout<<"m1:"<<t(1,0)<<endl;
    cout<<"m2:"<<t(1,0,true)<<endl;
    

    (alternativ kannst du auch aus a und/oder b berechnen, aus welcher Matrix die angeforderten Daten stammen könnten)

    **

    Bei deinem operator() sollte man das [b]else** weglassen da du überhaupt nichts zurückgibst. Zwar kann es nicht zu dem Fall kommen das nichts zurückgegeben wird aber ob alle Compiler das so akzeptieren... von daher einfach weglassen und keine Warnung vom Compiler bekommen 😉

    int Test::operator()(int a,int b,bool snd=false)
    {
      if(!snd)
        return m1[a][b];
      return m2[a][b];
    }
    

    Ausserdem sollte man sich immer dran gewöhnen bei non-void Funktionen/Methoden immer etwas zurück zugeben um undefiniertes Verhalten zu vermeiden.

    BR
    evilissimo



  • rgHorus schrieb:

    Ich hoffe es ist einigermaßen verständlich, was mein Problem ist!

    Ich glaube, dein Problem ist, dass du eigentlich gar nicht genau weißt, was dein Problem ist. Was willst du denn erreichen?


Anmelden zum Antworten