如何在 setter 方法中设置 boost::optional 成员变量的值?

How to set the value of a boost::optional member variable in a setter method?

本文关键字:成员 optional 变量 boost setter 方法 设置      更新时间:2023-10-16

>我无法发布我的确切代码,但我有一个类Mike,我希望它包含自定义对象类型的成员变量BobBob可能不会在构造Mike时设置,但我希望稍后在调用setter方法时设置它。我正在尝试通过以下方式使用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;
};

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

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

。有两种可能的解决方案:

  1. 使m_valueconst。在类中有一个const成员是不寻常的(尽管完全有效)。更常见的是使用const Bob,这样也会使成员const
  2. 使用emplace将新值分配给可选值,这将销毁旧值并创建一个新值,而不是分配给旧值(如果存在)。根据Bob的确切性质,这可能会稍微贵一些?

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