kleiner c++-code; finde fehler nicht. HILFE.



  • so, ich lerne mit viel mühe und FEHLER c++, aber diesmal komme ich nicht weiter.

    habe folgenden einfachen code, um einen 2-dimensionalen vektor zu erstellen und den +-operator zu überladen.

    class Vektor
    {
       public:
      Vektor(){
      x=0;
      y=0;
      }
      Vektor(int a, int b):x(a), y(b){};
    
             Vektor &operator+(const Vektor &V){
             Vektor *z;
             z = new Vektor(x+V.x, y+V.y );
             return *z;
          }
    
      private:
            int x,y;
    
    };
    
    int main()
    {
           int x,y, xx, yy;
         cout << "Bitte vom Vektor den x wert eingeben:" <<  endl;
         cin >> x;
         cout << "Bitte vom Vektor den y wert eingeben:" <<  endl;
            cin >> y;
            Vektor *V1;
            V1 = new Vektor(x,y);
    
            cout << "Bitte vom 2. Vektor den x wert eingeben:" <<  endl;
         cin >> xx;
         cout << "Bitte vom 2.Vektor den y wert eingeben:" <<  endl;
            cin >> yy;
            Vektor *V2;
            V2 = new Vektor(xx,yy);
    
              cout << (*V1 + *V2) << endl;  //Beide Vektoren sollen addiert ausgegeben werden
    
    	return 0;
    }
    

    beim compilieren kriege ich den fehler "illegal structure operation". WARUM? 😕



  • Hi,
    der op<< ist nicht für deinen Vektor überladen ...



  • mh dabei hatten wir doch schon einen thread hier zum them vektor und + operator überladen, wobei zu recht festgestellt wurde, dass es so keinen sinn macht



  • und dein operator+ hat ein Speicherloch. Warum erstellst du den temporären Vektor überhaupt dynamisch?

    Vektor operator+(const Vektor &V)
    {
       Vektor z(x+V.x, y+V.y );
       return z;
    }
    


  • Braunstein schrieb:

    und dein operator+ hat ein Speicherloch. Warum erstellst du den temporären Vektor überhaupt dynamisch?

    Vektor operator+(const Vektor &V)
    {
       Vektor z(x+V.x, y+V.y );
       return z;
    }
    
    Vektor operator+(const Vektor &V) const
    {
       return Vektor(x+V.x, y+V.y );
    }
    
    class Vektor
    {
      public:
      // ...
    
      float operator[]( int index ) const
      {
        assert( index >= 0 && index < 2 );
        return ( &x )[ index ];
      }
    
      float &operator[]( int index )
      {
        assert( index >= 0 && index < 2 );
        return ( &x )[ index ];
      }
    
      private:
      // ...
    }; 
    
    std::ostream &operator<<( std::ostream &o, const Vektor &v )
    {
      o << v[ 0 ] << v[ 1 ]; 
      return o;
    }
    


  • David_pb schrieb:

    float operator[]( int index ) const
      {
        assert( index >= 0 && index < 2 );
        return ( &x )[ index ];
      }
    

    Lieber hier ein const als Rückgabewert, damit man beim kompilieren schon den Fehler sieht, gleiches auch für den Paramtertypen, der lieber unsigned sein sollt bspw. size_t.

    "Bevorzuge Compiler-Meldungen gegenenüber "komisches" Laufzeitverhalten"

    Edit: Sry, ist ja lvalue, da sollte der Compiler auch schon meckern, aber const ist trotzdem schöner 🙂


Anmelden zum Antworten