2013-06-07 4 views
0

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

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

+1

В этом случае, я думаю, все в порядке. Все члены класса политики могут копировать через мелкую копию (например, оператор присваивания), включая ваш класс NRRan, который перегружает этого оператора, чтобы скопировать указатель * потока правильно. Единственное, что вам нужно беспокоиться, это копировать указатели. Если ваш класс обрабатывает такие вещи, как удаление/генерирование этого указателя, беспорядок с одним классом может испортиться с копией, поэтому вместо этого вам придется дублировать указатели на копии. Другие случаи, имеющие два класса, указывают один и тот же указатель, если они не удаляют их. – Lochemage

+0

Спасибо. Это то, о чем я думал (надеясь). – synaptik

ответ

2

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

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

Смежные вопросы