Как использовать члены временного экземпляра в C++?

У меня есть объект A с конструктором копирования и оператором присваивания, который имеет член QVector. Я использую это так:

QVector<B*> x = GetA().GetVector();
x.at(0)->doSomething();

Теперь я хочу сделать что-то со всеми буквами B в векторе, но поскольку из GetA() я получил только временную копию, указатели уже были удалены. Есть ли другой способ сделать что-то вроде

A a = GetA();
QVector<B*> x = a.GetVector();
x.at(0)->doSomething();

Это проблема моего конструктора копирования или что-то еще, что я могу исправить в реализации конструктора копирования или оператора присваивания?

Спасибо

1 ответ

Решение

Нет, это не проблема вашего конструктора копирования, но, конечно, это "что-то еще".

Вы должны вернуть вектор общих указателей из GetVector() функция, потому что вы действительно хотите, чтобы совместное владение на B* объекты, которые находятся в этом векторе между некоторыми объектами A и ваш код представлен в этом вопросе.

[ОБНОВИТЬ]

Этот метод цепочки: GetA().GetVector().at(0)->doSomething(); будет работать, потому что это гарантировано C++ std до последовательной точки (; в данном случае) все временные существуют.

Если вы разделите это на много строк, как в вашем примере, то вы должны сохранить результат GetA() в некоторой именованной переменной.

Другой способ - использовать дополнительную функцию, используя GetA() в качестве аргумента (очень похоже на ваше собственное решение):

void foo(const A& a)
{
   QVector<B*> x = a.GetVector();
   x.at(0)->doSomething();
}

foo(GetA());

Или даже:

void foo(const QVector<B*>& x)
{
   x.at(0)->doSomething();
}

foo(GetA().GetVector());

Или даже в C++11 используйте лямбда-выражение:

int main() {
  auto foo = [](const QVector<B*>& x)
    {
       x.at(0)->doSomething();
    };
    foo(GetA().GetVector());
}
Другие вопросы по тегам