Создайте объект и предотвратите разрушение - PullRequest
0 голосов
/ 09 ноября 2019

У меня есть класс

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 вызывает и очищает все заполненные значения, поэтому список (rmgControllers) содержит некоторые объекты со значениями по умолчанию, а не значениями, считываемыми из json.

Ответы [ 2 ]

1 голос
/ 09 ноября 2019

Когда вы вызываете push_back, чтобы вставить значение в вектор, это значение будет скопировано в него, если выбрана константная сигнатура l-значения.

Чтобы предотвратить этоВы можете создать значение на месте в векторе, используя emplace_back или вызывая std::move для перемещения значения при его возврате.

Однако в вашем случае это выглядит как копияКонструктор класса RmgController не определен правильно. Если у вас есть переменная-член типа указателя, вы должны определить пользовательский конструктор копирования (плюс также назначение копирования / перемещение и конструктор / деструктор, это называется Правило пяти ), в противном случае два экземпляра одного и того жеу класса могут быть все указатели, указывающие на один и тот же общий ресурс / состояние, что приводит к ошибке.

1 голос
/ 09 ноября 2019

Ваши параметры зависят от того, поддерживает ли 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));  
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...