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

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

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

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

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());
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]