Этот код отлично работает как в gcc 4.9.2, так и в Visual Studio 2013:
#include <iostream>
#include <memory>
#include <vector>
#include <algorithm>
using namespace std;
//A.h
class A{
public:
int alpha;
A(int input) : alpha(input){}
};
// B.h
typedef unique_ptr<A> APtr;
typedef vector<APtr> BVEC;
class B
{
public:
BVEC vec;
B(){}
const B& operator=(const B& b){
vec.clear();
for_each(b.vec.cbegin(), b.vec.cend(), [&](const unique_ptr<A>& i){vec.push_back(unique_ptr<A>(new A(*i))); });
return b;
}
B(const B& b){
vec.clear();
for_each(b.vec.cbegin(), b.vec.cend(), [&](const unique_ptr<A>& i){vec.push_back(unique_ptr<A>(new A(*i))); });
}
const B& operator=(B&& b){
vec.resize(b.vec.size());
move(b.vec.begin(), b.vec.end(), vec.begin());
return *this;
}
B(B&& b){
vec.resize(b.vec.size());
move(b.vec.begin(), b.vec.end(), vec.begin());
}
};
int main() {
B foo;
B bar;
for (auto i = 0; i < 10; ++i){
foo.vec.push_back(unique_ptr<A>(new A(i)));
}
bar = foo;
foo.vec.clear();
for (auto& i : bar.vec){
cout << i->alpha << endl;
}
foo = move(bar);
for (auto& i : foo.vec){
cout << i->alpha << endl;
}
return 0;
}
Я не знаю, что вы использовали для удаления в APtr
. (Я задал вопрос в комментариях, но еще не видел ответа.) Я подозреваю, что если вы правильно написали свой конструктор копирования для B
и конструктор копирования для A
, то ваша проблема связана с вашим средством удаления, AllocateA
.
Вы можете видеть в конструкторах копирования, которые я написал для B
, я динамически создаю идентичные A
в this.vec
для каждого A
в b.vec
. Я предполагаю, что это поведение, которое вы хотите. Если вы хотите просто переместить динамические распределения, я бы предложил использовать конструктор перемещения >как предложил Михал Валенсиак.
EDIT: После просмотра названия OP я почувствовал, что, возможно, это был конструктор перемещения. Поэтому я добавил один из них.
person
Jonathan Mee
schedule
29.01.2015
AllocateA
? Пожалуйста, скажите мне, что это не то, что вы назвали своим удаляющим средством. - person Jonathan Mee   schedule 29.01.2015unique_ptr
, но вы можетеmove
это :) - person Michał Walenciak   schedule 29.01.2015move
переменная-член в конструкторе копирования. Сделайте это в конструкторе перемещения. - person Jonathan Mee   schedule 29.01.2015unique_ptr
не то же самое, чтоshared_ptr
- person Jonathan Wakely   schedule 29.01.2015const B&
параметров. - person Jonathan Wakely   schedule 29.01.2015AllocateA
удаляет? Потому что это ваш второй аргумент шаблона дляunique_ptr
: cplusplus.com/reference/memory/unique_ptr /#parameters Мне интересно, не предполагалось ли, чтоAllocateA
будет вторым аргументом шаблона дляvector
в вашемBVEC
typedef
, посколькуvector
действительно принимает распределитель в качестве второго параметра шаблона. - person Jonathan Mee   schedule 29.01.2015