2016-06-29 5 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 (двойной х, Const станд :: строка & s = зЬй :: строка(), uint64_t & = 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

Вы можете использовать указатель вместо ссылки и в вашей реализации функции только изменить (разыменовано) значение, если указатель передается не 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; 
Смежные вопросы