Я заинтересован в улучшении моего понимания того, как избежать написания класса C++, который вызывает проблемы при копировании.Как определить, является ли класс C++ скопируемым
В частности, я написал класс с именем Policy
, который я намереваюсь скопировать. У меня есть , а не. Определен деструктор, не являющийся дефолтом, конструктор копирования или оператор присваивания копии. Единственный оператор Я перегружен следующий:
friend bool operator== (const Policy& p1, const Policy& p2) {
for(int i=0; i<p1.x.size(); i++) {
if(p1.x[i] != p2.x[i])
return false;
}
return true;
}
Члены класса являются либо стандартными типами данных, такие как int
, double
, bool
, std::string
, std::vector<double>
, std::vector<int>
, std::vector<string>
, или один из нескольких маленьких (и таким образом, не слишком сложные) классы, которые я определил, которые, безусловно, могут быть скопированы без каких-либо проблем. Теперь есть член Policy
, который является экземпляром класса NRRan
, который является классом, который я создал как обертка вокруг неконвертируемого стороннего типа данных; NRRan
выглядит следующим образом:
class NRRan {
public:
double doub() { return stream->doub(); }
int intInterval(const int& LB, const int& UB) { return LB+int64()%(UB-LB+1); }
void setNewSeed(const long& seed) {
delete stream;
stream = new Ranq1(seed);
}
NRRan() { stream = new Ranq1(12345); }
~NRRan() { delete stream; }
NRRan(const NRRan& nrran) {
stream = new Ranq1(12345);
*stream = *(nrran.stream);
}
NRRan& operator= (const NRRan& nrran) {
if(this == &nrran)
return *this;
delete stream;
stream = new Ranq1(12345);
*stream = *(nrran.stream);
return *this;
}
private:
Ranq1* stream; // underlying C-struct
Ullong int64() { return stream->int64(); }
};
Но вся суть NRRan
класса сделать Ranq1
Copyable. Итак, учитывая класс Policy
, как я описал его (извините, я не могу опубликовать большую часть кода), есть ли что-нибудь, что может вызвать проблему при копировании Policy
? Я ожидаю, что копирование создаст идеальную копию ценности для значения.
Более общий способ задать свой вопрос: Вообще говоря, какие типы вещей могут вызвать проблемы при копировании класса? Есть ли что-нибудь в дополнение к «Правилу трех» (или «Правило пяти»), которое должно быть обеспокоено при создании класса для копирования?
В этом случае, я думаю, все в порядке. Все члены класса политики могут копировать через мелкую копию (например, оператор присваивания), включая ваш класс NRRan, который перегружает этого оператора, чтобы скопировать указатель * потока правильно. Единственное, что вам нужно беспокоиться, это копировать указатели. Если ваш класс обрабатывает такие вещи, как удаление/генерирование этого указателя, беспорядок с одним классом может испортиться с копией, поэтому вместо этого вам придется дублировать указатели на копии. Другие случаи, имеющие два класса, указывают один и тот же указатель, если они не удаляют их. – Lochemage
Спасибо. Это то, о чем я думал (надеясь). – synaptik