Konstante Liste



  • Hi!

    Ich hätte eine Verständnisfrage bzgl. Initialisierung konstanter Objekte:

    In einer Klasse darf eine Membervariable nur bestimmte Werte annehmen. Dazu wollte ich eine konstante Liste mit den gültigen Werten definieren und zur Überprüfung vergleichen, ob der Wert der Variablen in der Liste enthalten ist.

    Wie jedoch initialisiere ich eine konstanten Liste/Vectors? Bzw. ist das überhaupt der richtig Methode?

    Folgendes funktioniert leider nicht:

    static const List<int> VALID_VALUE;
    VALID_VALUE.append(2);
    
    'List<T>::append' : 2 overloads have no legal conversion for 'this' pointer
    

    mfg,
    soad


  • Mod

    Es gibt einige list-Konstruktoren die du verwenden könntest. Der mit der Signatur

    template < class InputIterator > list ( InputIterator first, InputIterator last, const Allocator& = Allocator() );
    

    bietet sich an.

    Wenn ich jedoch eine Variable hätte, die nur bestimmte Werte annehmen soll, dann würde ich eher eine neue Klasse als Variablentyp anlegen, die nur diese gültigen Werte zulässt.



  • Was spricht in diesem Fall gegen ein Array?

    bool isvalid( const int &val )
    {
    	const int valid_values[] = { 1, 3, 4 };
    
    	return std::binary_search( valid_values, valid_values + sizeof( valid_values ) / sizeof( int ), val ); //Ich trau dem  Programmierer mal zu die Werte zu sortieren
    }
    


  • Sinnvoller als die Liste konstant zu machen ist es wahrscheinlich, die überprüfende Methode mit const zu qualifizieren. Oder gar nichts zu tun. Bei einer kleinen Schnittstelle sollte das Risiko eines versehentlichen Zugriffs minimal sein.

    Jedenfalls schränkt man sich mit const std::list<int> als Member viel stärker ein, als einem normalerweise lieb ist. Daher rate ich von diesem Ansatz ab.

    Übrigens besitzt std::binary_search() auf einer std::list wegen der Bidirectional-Iteratoren eine lineare Zeitkomplexität. Ich würde zu std::set raten, vielleicht ist auch eine lineare Suche mit std::find() vertretbar.



  • Ich danke für eure Hilfe!


Anmelden zum Antworten