Как установить значение переменной Boost :: Option в методе сеттера? - PullRequest
0 голосов
/ 15 марта 2019

Я не могу опубликовать свой точный код, но у меня есть класс Mike, где я хочу, чтобы он содержал переменную-член пользовательского типа объекта Bob.Bob не может быть установлено при построении Mike, но я хочу, чтобы оно было установлено позже, когда вызывается метод установки.Я пытаюсь использовать boost::optional<Bob> для этого следующим образом:

class Mike
{
  public:
    void setBob(const Bob& bob)
    {
      m_bob = bob;
    }
    boost::optional<Bob> getBob() const
    {
      return m_bob;
    }
  private:
    boost::optional<Bob> m_bob;
}

Это выдает ошибку:

error: use of deleted function ‘Bob& Bob::operator=(const Bob&)’
     void assign_value ( argument_type val, is_not_reference_tag ) { get_impl() = val; }

Я также пытался заменить строку

m_bob = bob;

с

m_bob = boost::optional<Bob>(bob);

, но это приводит к почти идентичной ошибке.

Класс Bob выглядит следующим образом:

class Bob
{
  public:
    Bob(const double value) : m_value(value)
    {
    }
  private:
    const double m_value;
};

Есть идеи, как правильно это сделать?

1 Ответ

1 голос
/ 15 марта 2019

Оператор присваивания по умолчанию Bob удален, поскольку невозможно обновить значение m_value, так как оно равно const.

Существует два возможных решения:

  1. Make m_value non const.Необычно иметь в классе const член (хотя и вполне допустимый).Было бы более привычно использовать const Bob, что затем сделало бы член const тоже.
  2. Присвойте новое значение необязательному, используя emplace, это уничтожит старое значение и создастновое значение вместо присвоения старому значению, если оно существует.В зависимости от точного характера Bob это может быть немного дороже?

    void setBob(const Bob& bob)
    {
       m_bob.emplace(bob);
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...