2016-06-29 14 views
3

Ich habe eine polymorphe Methode Hierarchie wie folgt aus:Optionales Argument, als Referenz für polymorphe Methode?

void func(double x, const std::string& s) = 0; 

und ich möchte eine „optional“ Argument übergeben, die im Verfahren modifiziert:

void func(double x, const std::string& s, uint64_t& i = 0) = 0; 

aber ich Fehler, die meine Referenz war nicht initialisiert.

Was ist der beste Weg, um das oben genannte zu implementieren?

+0

Leere func (double x, const std :: string & s = std :: string(), uint64_t & i = 0) = 0; – dgsomerton

+0

Warum muss es "per Referenz" sein? Kannst du nicht einfach an Wert vorbeikommen? Dann wäre dein Standardwert gut. –

Antwort

5

uint64_t& ist eine L-Wert-Referenz und kann daher nicht an einen R-Wert gebunden werden, wie das Literal, das Sie als Standardargument angeben. Sie müssen einen L-Wert als Standard angeben.

Eine Option ist ein Dummy-Objekt zu definieren, die Sie als Standard übergeben, zB:

static uint64_t dummy_default_value = 0; 
void func(double x, const std::string& s, uint64_t& i = dummy_default_value) = 0; 
3

Sie Zeiger statt Referenz verwenden können und in Ihrer Funktion Implementierung nur (dereferenced) Wert ändern, wenn übergeben Zeiger nicht ist nullptr

void func(double x, const std::string& s, uint64_t* pi = nullptr) = 0; 
5

würde ich Standardparameter für virtuelle Methode (siehe good-practice-default-arguments-for-pure-virtual-method) vermeiden, so fügen Sie einfach einen zusätzlichen Überlastung

virtual void func(double x, const std::string& s, uint64_t& i) = 0; 
void func(double x, const std::string& s) { int i; func(x, s, i) }; 

Wenn Sie wirklich Standardargument behalten möchten, können Sie boost::optional verwenden:

virtual void func(double x, 
        const std::string& s, 
        boost::optional<uint64_t&> i = boost::none) = 0; 
Verwandte Themen