2011-01-13 3 views
4

Когда я компилирую мой класс, я получаю серьезную ошибку:Ошибка C2558 - конструктор копирования

C2558 no copy constructor available or copy constructor is declared 'explicit'

Но мой конструктор копирования не является ни частной, ни явным!

Заголовок:

#include "Csequence.h" 

using namespace std; 

class Cnoeud 
{ 
private: 
    Cnoeud *oNOEpere; 
    vector<Cnoeud> oNOEfils; 
    Csequence oNOEsequence; 
    bool oNOEStatut; 

public: 
    // Liste des constructeurs 
    Cnoeud(); 
    Cnoeud(Cnoeud &); 
    ~Cnoeud(){} 

    // Liste des accesseurs et des modificateurs 
    Cnoeud * NOEAfficherpere(){ return oNOEpere;} 
    vector<Cnoeud> NOEAfficherfils() {return oNOEfils;} 
    Csequence NOEAffichersequence() {return oNOEsequence;} 
    bool NOEAfficherstatut() { return oNOEStatut;} 
    void NOEModifierpere(Cnoeud oNOEp){ *oNOEpere=oNOEp;} 
    void NOEModifierfils(vector<Cnoeud>); 
    void NOEModifiersequence(Csequence oNOEs){oNOEsequence = oNOEs;} 
    void NOEModifierstatut(bool {oNOEStatut = b;} 

    // Liste des fonctions membres 
    void NOEViderfils(){ oNOEfils.clear();} 

    // Surcharge de l'opérateur d'affectation 
    Cnoeud & operator=(Cnoeud &) ; 
}; 

Источник:

Cnoeud.cpp 

#include <iostream> 
#include <vector> 
#include "Cnoeud.h" 

using namespace std; 

Cnoeud::Cnoeud() 
{ 
    oNOEStatut= 0; 
    oNOEsequence.SEQInitialiserdatesfin(); 
    oNOEsequence.SEQInitialisersequence(); 
    oNOEpere = NULL; 
} 

Cnoeud::Cnoeud(Cnoeud & oNOE) 
{ 
    oNOEStatut= oNOE.oNOEStatut; 
    oNOEsequence = oNOE.NOEAffichersequence(); 
    oNOEpere = oNOE.NOEAfficherpere(); 
    oNOEfils.clear(); 
    vector<Cnoeud>::iterator it; 
    for(it=oNOE.NOEAfficherfils().begin();it!=oNOE.NOEAfficherfils().end();it++) 
    { 
     oNOEfils.push_back(*it); 
    } 
} 
+0

Как-то ваш код потерял все отступы при копировании с его IDE. Было бы намного легче читать, если бы вы могли исправить это. Там также должно быть что-то отсутствует. '# endif' просто застрял там случайно, без' # if'. –

+0

Чтобы иметь возможность использовать функции объявленного объекта const, его функции должны быть объявлены как const, а компилятор не будет знать, будут ли функции изменять объект const. Я рекомендую прочитать Const Correctness [link] (http: // www.parashift.com/c++-faq-lite/const-correctness.html) на сайте C++ FAQ. – Zoomulator

ответ

18

Это Cnoeud(Cnoeud &) не конструктор копирования, как ожидается, по большей части кода с помощью этого класса. Конструктор копирования должен быть

Cnoeud(const Cnoeud &); 

А почему бы вам не сделать этот аргумент const? Конструктор копирования, конечно, не должен изменять объект, из которого он копируется. Обратите внимание, что это относится и к вашему оператору присваивания. Кроме того, эти аксессоров должны быть const функции-члены:

Cnoeud * NOEAfficherpere() const { return oNOEpere;} 
//       ^^^^^ 

См this answer о не использовании const.

+0

Я сделал это, но он сказал, что я не могу получить доступ к getters et seters, например bool NOEAfficherstatut() {return oNOEStatut;} Cnoeud * NOEAfficherpere() {return oNOEpere;} Поэтому я добавляю const к этому методу и после компиляции я нашел ту же ошибку C2558 о копире contructor – undertaker705

+4

'Cnoeud (Cneoud &);' является конструктором копирования. Конструктор копирования может принимать ссылку 'const' или неконсоль. –

+0

@Charles: Ой, я не видел этого комментария. Что вы имеете в виду? Должен ли компилятор принять 'Cnoeud (Cneoud &)'? – sbi

3

Copy конструктор принимает константный справочно-то есть,

Cnoeud::Cnoeud(const Cnoeud& oNOE)

+0

Я сделал это, но он сказал, что я не могу получить доступ к getters и seters, например bool NOEAfficherstatut() {return oNOEStatut;} Cnoeud * NOEAfficherpere() {return oNOEpere;} Поэтому я добавляю const к этому методу и после компиляции я нашел та же ошибка C2558 о копире contructor – undertaker705

+0

Конструктор копирования не _have_, чтобы взять ссылку 'const', хотя это обычно должно быть. В этом случае это невозможно, потому что в реализации используются не-'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' –

2

Cnoeud(Cnoeud &) не нормальная подпись для копирования конструктора, хотя иногда используется для «передачи собственности» при копировании, т.е. она движется что-то от начала координат до нового объекта. Это обычно используется, чтобы обойти проблемы, которые объект собирается «очистить» после использования, когда вы не хотите использовать указатели с подсчетом ссылок.

С C++ 0x будет семантика перемещения с ссылками на r-значение, где вы можете сделать Cnoeud(Cnoeud &&), чтобы «переместить» объект, который не копируется, но может быть возвращен из функции.

Невозможно использовать объекты с семантикой передачи-собственности (например, auto_ptr) в коллекциях, таких как вектор. Вам повезло в каком-то смысле, что вы попали в ошибку компилятора, потому что это избавило вас от боли во время выполнения ошибки - гораздо труднее найти проблему.

Если вы хотите, чтобы правильный конструктор копирования передал параметр в качестве ссылки на константу (как предложили другие).

Кстати, в вашем «конструктор копирования» оказывается, что

oNOEfils.clear(); 
vector<Cnoeud>::iterator it; 
for(it=oNOE.NOEAfficherfils().begin();it!=oNOE.NOEAfficherfils().end();it++) 
{ 
oNOEfils.push_back(*it); 
} 

может быть легко заменен

oNOEfils = oNOE.NOEAfficherfils();

эффективнее писать (один-лайнер) и почти наверняка более эффективен для запуска.

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