Problem mit Klassenkonstruktor



  • Hallo

    Ich habe ein Programm, in dem ich eine Klasse namens sparse verwenden möchte. Die Klasse hab ich mir aus dem Netz gezogen und möchte gern eine globale Variable in meinem Hauptprogramm definieren. Die Klasse sieht wie folgt aus:

    //  sparse.h
    
    #ifndef sparse_h
    #define sparse_h
    
    #include <assert.h>
    #include <iostream>
    #include <map>
    
    typedef map<int,double>::iterator iterator;
    typedef map<int,double>::const_iterator const_iterator;
    
    class sparse {
    
    public:
      sparse(int __n) : n(__n) { s=new map<int,double>[n]; }
      sparse(const sparse& t);
      ~sparse() { delete[] s; }
    
      double& operator() (int i, int j)       { return s[i][j]; }
      double  operator() (int i, int j) const { return s[i][j]; }
      map<int,double>& operator[] (int i) const { return s[i];  }
    
      double* vecmul(double x[], double b[]) const;
    
      int size() const { return n; }
    
    private:
      int n;
      map<int,double> *s;
    
    };
    
    #endif
    

    Wenn ich nun ein neues Objekt vom Typ sparse definieren wollte, würde das in etwa so aussehen:

    sparse s(1000);
    

    Allerdings weiß ich zu Beginn nicht, wieviele Elemente ich brauche. Wenn ich also einfach ein Objekt "sparse s" definiere, bekomme ich im Compiler die Fehlermeldung, dass kein geigneter Standardkonstruktor verfügbar ist. Wie kann ich daher den Konstruktor so umschreiben, dass ich die Ordnung erst später definieren kann?



  • sparse() : n(0) {}
    void set_new_size( int __n )
    {
        delete[] s;  // ev. unnötig, aber sicher ist sicher
        n = __n;
        s=new map<int,double>[n];
    }
    
    //Aufruf
    
    sparse s;
    //...
    s.set_new_size( 1000 );
    

    Allerdings musst du dann darauf achten, dass du das Objekt s bzw. den map-Array vorher nicht benutzt.



  • Vielen Dank 1013

    Es funktioniert. Allerdings ist das delete[] s nicht so gut - da s ja noch nicht initialisiert wurde, gibts hier n Fehler. Ohne die Zeile klappts aber 🙂

    Danke nochmal



  • Du solltest es trotzdem verwenden - spätestens wenn du ein zweites Mal set_new_size() aufrufst, läufst vdu sonst in ein Memory-Leck. Deinen Fehler löst du besser, indem du s initialisierst (mit einem "s(0)" in der Initialisierungsliste des Konstruktors).



  • delete (und delete[] ?!) dürfen auf Nullpointer angewendet werden. Daher ist das delete an dieser Stelle bei initialisierung von s kein Problem.


Anmelden zum Antworten