Так я пишу большие пять для класса, который имеет динамический целочисленный массивC правило ++ пяти для класса, который имеет динамическую память
struct intSet {
int *data;
int size;
int capacity;
intSet();
~intSet();
intSet(const intSet& is);
intSet(intSet &&is);
intSet &operator=(const intSet& is);
intSet &operator=(intSet &&is);
}
То, что я получил до сих пор:
intSet::intSet(const intSet& is){
this->size=is.size;
this->capacity=is.capacity;
this->data=is.data;
}
intSet::intSet(intSet &&is){
this->size=is.size;
this->capacity=is.capacity;
this->data=is.data;
is.data=nullptr;
}
intSet& intSet::operator=(const intSet& is){
if(&is!=this){
size=is.size;
capacity=is.capacity;
delete [] data;
data=is.data;
data=new int[capacity];
for(int i=0;i<size;i++){
data[i]=is.data[i];
}
}
return *this;
}
intSet& intSet::operator=(intSet &&is){
if(&is!=this){
size=is.size;
capacity=is.size;
delete [] data;
data=is.data;
is.data=nullptr;
}
return *this;
}
intSet::~intSet(){
delete [] this->data;
}
Ясно что-то не так с этим, но я не очень хорошо знаком с большими пятью ... Я много искал, но до сих пор не нашел ответа ...
Вы имеете в виду «Правило пяти»: http://en.cppreference.com/w/cpp/language/rule_of_three –
Ваш экземпляр копии делает мелкую копию, но ваш оператор присваивания копий делает глубокую копию. Кроме того, используйте список инициализаторов конструктора, это не Java. – user2296177
@BryanChen, так что большая пятерка - это конструктор копирования, назначение копии, перемещение конструктора, назначение перемещения. – anddn