Erreur C2558 - constructeur de copie
Quand je compile ma classe, j'obtiens une erreur grave:
C2558 pas de constructeur de copie disponibles ou le constructeur de copie est déclaré 'explicit'
Mais mon constructeur de copie n'est ni privé, ni explicite!
En-tête:
#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 &) ;
};
Source:
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);
}
}
En quelque sorte, votre code perdu tous indentation lors de copier-coller à partir de votre IDE. Il serait beaucoup plus facile à lire si vous pouviez corriger cela. Il doit aussi y avoir quelque chose qui manque.
Pour être autorisé à utiliser un const déclaré de l'objet de fonctions, les fonctions doivent être déclarées comme const ainsi, ou le compilateur ne sait pas si les fonctions de modifier la const objet. Je recommande la lecture de Const Correctness lien sur le C++ FAQ du site.
# endif
est juste coincé là au hasard, sans #if
.Pour être autorisé à utiliser un const déclaré de l'objet de fonctions, les fonctions doivent être déclarées comme const ainsi, ou le compilateur ne sait pas si les fonctions de modifier la const objet. Je recommande la lecture de Const Correctness lien sur le C++ FAQ du site.
OriginalL'auteur undertaker705 | 2011-01-13
Vous devez vous connecter pour publier un commentaire.
Que
Cnoeud(Cnoeud &)
n'est pas un constructeur de copie, comme il est prévu par la plupart de code à l'aide de cette classe. Un constructeur de copie doit êtreEt pourquoi pas vous faire de cet argument
const
? Un constructeur de copie certainement ne devrait pas modifier l'objet de copies à partir de. Notez que la même chose s'applique à votre opérateur d'affectation. Aussi, ces accesseurs doivent êtreconst
fonctions de membre:Voir cette réponse de ne pas l'utiliser
const
.Cnoeud(Cneoud&);
est un constructeur de copie. Un constructeur de copie est autorisée à prendre unconst
ou un non-const
de référence.Oups, je n'avais pas vu ce commentaire. Que voulez-vous dire? Si le compilateur accepte
Cnoeud(Cneoud&)
?Vous n' ce? Si ce paramètre n'est
const
(comme il se doit), il ne peut invoquerconst
fonctions de membre. Cependant, pur accesseurs doivent êtreconst
, trop. Voir FAQ pour savoir comment faire les fonctions de membres déclarent qu'ils ne changent pas l'objet qu'elles sont invoquées pour.À l'aide de VC++ 2008 exp. et obtenu la même erreur que l'OP. Je n'avais pas déclaré la copie argument de la const, et VC++ accepté comme un constructeur de copie après l'ajout.
OriginalL'auteur sbi
Constructeur de copie prend const référence - qui est,
Cnoeud::Cnoeud(const Cnoeud& oNOE)
Un constructeur de copie n'est pas pour prendre un
const
de référence bien qu'il devrait normalement. Dans ce cas, il ne peut pas parce que la mise en œuvre utilise non-const
fonctions de membre de l'argument.OriginalL'auteur Puppy
Cnoeud( Cnoeud & )
n'est pas normal de signature pour un constructeur par copie même si elle est parfois utilisée pour "transfert de propriété" lors de la copie, c'est à dire qu'il se déplace quelque chose de l'origine de l'objet nouveau. Ceci est communément utilisé pour contourner les problèmes de l'objet qui est en train de "nettoyer" après utilisation lorsque vous ne désirez pas utiliser de référence compte de pointeurs.Avec C++0x, il y aura la sémantique de déplacement avec la r-valeur de références où vous pouvez faire
Cnoeud( Cnoeud && )
de "bouger" un objet qui n'est pas copiable, mais peut être renvoyée par une fonction.Il n'est pas sûr d'utiliser des objets de transfert de propriété sémantique (comme auto_ptr) dans les collections de type vecteur. Vous avez de la chance dans un sens que vous frappez une erreur de compilation, car il vous a sauvé la douleur d'une erreur d'exécution, plus tard, beaucoup plus difficile de trouver le problème.
Si vous voulez un bon constructeur par copie, puis passer le paramètre const référence (comme d'autres l'ont suggéré).
Par la façon dont, dans votre "constructeur de copie" il semble que
pourrait facilement être remplacé par
oNOEfils = oNOE.NOEAfficherfils();
Plus efficace d'écrire (one-liner) et presque certainement plus efficace pour exécuter trop.
OriginalL'auteur CashCow