2016-06-29 15 views
3

私はこのようなポリモーフィックメソッド階層があります。ポリモーフィックメソッドのオプションの引数(参照)?

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

を、私は、メソッド内で変更され、「オプション」の引数渡したい:

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

を私は私の参照がしたエラーを受け取ります初期化されていません。

上記を実装する最良の方法は何ですか?

+0

ボイドFUNC(ダブルのx、constのはstd ::文字列&S =のstd ::文字列()、uint64_tの&I = 0)= 0; – dgsomerton

+0

「参照する」必要があるのはなぜですか?あなたは価値を伝えることができませんか?その後、デフォルト値が問題ありません。 –

答えて

5

uint64_t&はL値リファレンスであり、デフォルトの引数として提供するリテラルのようにR値にバインドできません。デフォルトとしてL値を指定する必要があります。渡されたポインタがない場合は、代わりに参照をして、機能の実装のみ変更(間接参照)値内のポインタを使用することができます

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

1つのオプションは、デフォルトとして渡すダミーのオブジェクト、例えばを定義することですnullptr

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

私はこれだけの余分な過負荷を追加し、仮想メソッド(good-practice-default-arguments-for-pure-virtual-methodを参照)のデフォルトパラメータを回避する

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) }; 

あなたが本当にデフォルト引数を保持したい場合は、あなたがboost::optionalを使用することがあります。

virtual void func(double x, 
        const std::string& s, 
        boost::optional<uint64_t&> i = boost::none) = 0; 
関連する問題