创建对象并防止其被破坏

我有一堂课

class ListOfControllers
{
public:
    ListOfControllers();        
    ~ListOfControllers();    
    QList<RmgController> rmgControllers;

    qjsonobject toJson() const;
    void fromJson(qjsonobject obj);
};

fromJson中,我想读取一个json并填写QList<RmgController> rmgControllers

void ListOfControllers::fromJson(qjsonobject obj)
{
    .
    .
    .
            rmgControllers.clear();
            for (...)
            {
                RmgController rmg;
                rmg.fillWithValues();//fill the object with values from json
                rmgControllers.push_back(rmg);
                //at this point the DESTRUCTOR of RmgController is being called and the filled values CLEARED
            }
}

当我离开对象创建范围时,RmgController的析构函数将引发并清除所有填充值,因此List(rmgControllers)包含一些具有默认值的对象,而不是从json读取的值。

gulen123 回答:创建对象并防止其被破坏

您的选择取决于RmgController是否可移动(如果您为其提供了自定义复制操作符和/或自定义删除器,则可能没有)。如果没有,则可以使用emplace_back(假设QList与std :: list具有相似的接口)。

类似这样的东西:

    rmgControllers.clear();
    for (...)
    {
        // emplace default-constructed object at end of list
        rmgControllers.emplace_back();  

        // reference added controller
        RmgController&  rmg = rmgControllers.back(); 

        //fill the object with values from json
        rmg.fillWithValues();
    }

如果RmgController具有移动意识,则只需将其移至列表末尾即可。

    rmgControllers.clear();
    for (...)
    {
        // create controller
        auto rmg = RmgController(); 

        //fill the object with values from json
        rmg.fillWithValues();

        // move new controller to end of list
        rmgControllers.push_back(std::move(rmg));  
    }
,

调用push_back将值推入向量时,如果选择了const l值引用签名,则该值将被复制

为防止这种情况,您可以使用emplace_back或通过调用std::move将向量推回原位来在向量中原位构造值。

但是,在您的情况下,类RmgController的副本构造函数似乎未正确定义。如果您具有指针类型的成员变量,则必须定义自定义的副本构造函数(加上副本分配/移动分配和构造函数/析构函数,这被称为 5的规则),否则,将使用两个实例同一类的指针可能全部指向同一共享资源/状态,这会导致错误。

本文链接:https://www.f2er.com/3133524.html

大家都在问