Как определить, является ли класс 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 копируемый. Итак, учитывая Policy Класс, как я описал это (извините, я не могу опубликовать большую часть кода), есть ли что-то, что может вызвать проблемы при копировании Policy? Я ожидаю, что копирование создаст идеальное соотношение цены и качества.

Более общий способ задать мой вопрос заключается в следующем: Вообще говоря, какие типы вещей могут вызвать проблемы при копировании класса? Есть ли что-то, кроме «правила трех» (или «правила пяти»), на которое следует обратить внимание при создании копируемого класса?

0

Решение

Ну, этот вопрос вводит в заблуждение ..

Один ответ лайнера может быть как — использовать станд :: is_copy_constructible чтобы узнать, можно ли скопировать класс или нет.

2

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

Класс не подлежит копированию, если он имеет удаленный или закрытый конструктор копирования / оператор присваивания или имеет хотя бы один член с удаленным или личным копированием конструктор / оператор присваивания (применяется рекурсивно).

пример:

#include <iostream>
#include <type_traits>

class A{

};

class B {
private:
A a;
B(const B&) = default;
B& operator=(const B&) = default;
public:
B() = default;
};

class NonCopyable {
int i_;
public:
NonCopyable() : i_{0}
{}
NonCopyable(const NonCopyable&) = delete;
NonCopyable& operator=(const NonCopyable&) = delete;
};struct Composable {
NonCopyable nc;
};

struct C {
A a;
B b;
};int main()
{
A a;
A aa{a};                // copy construct
A aaa = a;              // copy assign
B b;
//B bb{b};              // can't
//B bbb = b;                // can't
NonCopyable nc;
//NonCopyable nc2 = nc; // cannot
//NonCopyable nc3{nc};  // cannot
Composable comp;
//Composable comp2{comp};   // can't copy construct either
//Composable comp3 = comp;// can't copy assign either

std::cout << std::boolalpha;
std::cout << std::is_copy_assignable_v<A> << '\n';
std::cout << std::is_copy_assignable_v<NonCopyable> << '\n';
std::cout << std::is_copy_constructible_v<Composable> << '\n';
std::cout << std::is_copy_constructible<C>::value << '\n';
}

Выход

true
false
false
false

Аналогично для неподвижных ..

0

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