У меня есть объект A с конструктором копирования и оператором присваивания, который имеет член QVector. Я использую это так:
QVector<B*> x = GetA().GetVector();
x.at(0)->doSomething();
Теперь я хочу сделать что-то со всеми B в векторе, но из Получить() Я получил только временную копию, указатели уже были удалены. Есть ли другой способ сделать что-то вроде
A a = GetA();
QVector<B*> x = a.GetVector();
x.at(0)->doSomething();
Это проблема моего конструктора копирования или что-то еще, что я могу исправить в реализации конструктора копирования или оператора присваивания?
Спасибо
Нет, это не проблема вашего конструктора копирования, но, конечно, это «что-то еще».
Вы должны вернуть вектор общие указатели от 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());
}
Других решений пока нет …