Использование RAII для упрощения передачи объектов другим объектам без копирования - PullRequest
0 голосов
/ 02 апреля 2020
extern class objx;
class Someclass
{
public:
    Someclass();
    void bar(objx);
    objx &om;
};

void foo()
{
    Someclass c;
    objx o;
    c.bar(o);

}

void Someclass::bar(objx& op)
{
//Save op in some local privatefield for later use
    om = op; //Here there should not be a copy;
}

Выше код неправильный не так ли? Потому что когда o выходит из области видимости в foo (), он разрушается. Есть ли способ не копировать o в новый объект в баре? Например, используя bar (objx && op), чтобы нам не приходилось копировать объекты или использовать умные указатели и, конечно же, избегать нового / удаления? И когда bar () возвращает op, go выходит из области видимости, и объект разрушается.

[EDIT] Я мог бы вместо этого использовать указатель. Но вызывающая сторона должна отслеживать время жизни объекта. Вот чего я хочу избежать.

[EDIT2] Вопрос в следующем: существует ли механизм для поддержания локальной переменной в действии, пока ее ссылка передается посредством ссылки на другие функции (области)?

[EDIT4] Этот код выполняет те же функции, используя указатели:

#include <sstream>
class Someclass
{
public:
    Someclass() {  }
    void bar(std::stringstream *);
    std::stringstream *om;
};


void Someclass::bar(std::stringstream* op)
{
    om = op; 
}

int main()
{
    Someclass c;
    std::stringstream o;
    c.bar(&o);
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

Из ответов, которые вы любезно предоставили, я пришел к выводу, что это можно сделать, если в проходящем объекте реализована семантика перемещения.

0 голосов
/ 02 апреля 2020

Выше код неправильный не так ли? Потому что когда o выходит из области видимости в foo (), он уничтожается.

Это зависит от того, что означает «Сохранить операцию в каком-то локальном приватном поле для последующего использования». Делать копию правильно. Ссылка на объект не будет.

Есть ли способ не копировать o в новый объект в баре?

Вместо этого вы можете перейти в новый объект.

Класс получателя уже создан.

Вариант 1: Не делайте этого.

Вариант 2: Назначьте элемент значения.

...