C++ 如何在setter方法中设置boost::可选成员变量的值?

C++ 如何在setter方法中设置boost::可选成员变量的值?,c++,boost,C++,Boost,我无法发布确切的代码,但我有一个类Mike,我希望它包含自定义对象类型的成员变量BobBob可能不会在构建Mike时设置,但我希望稍后在调用setter方法时设置它。我正试图用一个boost::optional来实现这一点,方法如下: class Mike { public: void setBob(const Bob& bob) { m_bob = bob; } boost::optional<Bob> getBob() co

我无法发布确切的代码,但我有一个类
Mike
,我希望它包含自定义对象类型的成员变量
Bob
Bob
可能不会在构建Mike时设置,但我希望稍后在调用setter方法时设置它。我正试图用一个
boost::optional
来实现这一点,方法如下:

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;
}
我也试着换了线

m_bob = bob;


知道正确的方法是什么吗?

删除了
Bob
的默认赋值运算符,因为
m_value
的值是
const
而无法更新

有两种可能的解决方案:

  • 使
    m_值
    non
    const
    。类中有
    const
    成员是不常见的(尽管完全有效)。通常使用
    const Bob
    ,这将使成员
    const
  • 使用
    emplace
    将新值分配给可选值,这将销毁旧值并创建新值,而不是分配给旧值(如果存在)。根据Bob的确切性质,这可能会稍微贵一点

    void setBob(const Bob& bob)
    {
       m_bob.emplace(bob);
    }
    

  • Bob
    似乎是不可分配和不可复制的。如果是这种情况,则无论是否在数据成员周围使用
    std::optional
    ,都无法将其分配给数据成员。与此代码无关,所有内容都与
    Bob
    的语义有关。请提供。什么是Bob?使用
    可选
    时是否会出现相同的错误?对于非可选的
    Bob
    ,您是否会遇到相同的错误?对于非可选的
    Bob
    ,我会遇到一个错误,因为面
    Bob
    没有默认构造函数
    Bob
    必须在其构造函数中包含多个参数,因此在构造
    Mike
    时,不能使用空的
    Bob
    成员变量。这可能是导致这个问题的原因吗?可能是。请出示一个mcve,这样我们就可以确定我决定使用选项1,因为有一个常量成员变量可能会在我的软件中引起类似的问题。值
    m_value
    不应该更改,但是保持它常量似乎不值得为我的用例费心。
    m_bob = boost::optional<Bob>(bob);
    
    class Bob
    {
      public:
        Bob(const double value) : m_value(value)
        {
        }
      private:
        const double m_value;
    };
    
    void setBob(const Bob& bob)
    {
       m_bob.emplace(bob);
    }