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' pointermfg,
soad
-
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
constzu 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 einerstd::listwegen der Bidirectional-Iteratoren eine lineare Zeitkomplexität. Ich würde zustd::setraten, vielleicht ist auch eine lineare Suche mitstd::find()vertretbar.
-
Ich danke für eure Hilfe!