2010-12-13 6 views
1

je suis nouveau à la programmation C++ et je serai heureux si vous pouvez m'aider. j'ai essayé d'écrire ce code:nouvel objet en C++

bool RailwayLineList:: AddInTail(const RailwayLine& data) 
{ 
    //there is no linked list to add the element 
    if(this==NULL) 
     return false; 
    RailwayLineLink *newLink = new RailwayLineLink(data); 
} 

quand j'ai essayé de le déboguer j'ai vu que le constructeur de copie avait été appelée et les données ont été initialisées avec des ordures (la classe utilise un constructeur par défaut).

Pourquoi le constructeur de copie est-il appelé?

+0

Salut, bienvenue à StackOverflow. À l'avenir, lorsque vous écrivez du code, vous devez le mettre en évidence et cliquer sur le bouton avec le code binaire; Cela le formatera pour qu'il apparaisse correctement. :-) –

+1

Sans voir le constructeur 'RailwayLineLink' que vous utilisez, c'est difficile à dire, mais ça ressemble à" parce que vous l'avez demandé ". Mettez un point d'arrêt sur le constructeur de copie vide (quelle classe interrogez-vous, au fait?) Et vérifiez la callstack pour être sûr. –

+0

@Platinum Azure: WTF ?!J'ai ajouté des espaces manuellement à chaque ligne de code que j'ai écrit !! ; ( – BlackBear

Répondre

1

if (this == NULL) est techniquement une construction valide mais au moment où il est atteint, un comportement indéfini a déjà été généré si l'instruction pouvait être vraie. NE FAITES PAS CELA!!!

+0

Cela aurait pu être mieux comme un commentaire ou un addenda à une réponse réelle – 3Doubloons

+0

Cela devrait être un commentaire, pas une réponse. –

+0

Il n'y a rien de mal à comparer ceci à NULL, le comportement menant à ce que devenir NULL est la source réelle du problème. –

2

Un constructeur de copie est un constructeur avec une signature spécifique. Il prend un seul paramètre, de const référence au même type en cours de construction. Donc, pour un class Foo, le constructeur de copie ressemble à ceci:

Foo::Foo(const Foo&) 

Il y a 2 autres types de constructeurs: par défaut et convertir. Le constructeur par défaut ne prend pas des paramètres (ou peut être appelé comme si elle n'a pas pris de paramètres, par exemple, tous les paramètres par défaut ont):

Foo::Foo() 

... et le destructor convert est fondamentalement autre chose. Par exemple:

Foo::Foo(const Bar&) 

pourquoi le constructeur de copie être appelé?

Dans votre cas, vous appelez un constructeur RailwayLineLink mais en passant dans une référence const à un RailwayLine, de sorte que vous appelez en fait un constructeur de conversion, pas un constructeur de copie.

Le constructeur de conversion est appelé parce que vous l'avez appelé:

new RailwayLineLink(data); 

Ceci construit un nouvel objet RailwayLineLink, en passant data comme le seul et seul paramètre au constructeur.

Si vous avez un constructeur de convertir vide, qui ressemble à quelque chose comme ceci:

RailwayLineLink::RailwayLineLink(const RailwayLine&) 
{ 
} 

... alors tous les membres de la nouvelle copie sera construite par défaut, et contiennent probablement des déchets.

En général, lorsque vous implémentez un constructeur de copie, vous voulez faire une sorte de copie de l'original de membre à membre à la copie, comme ceci:

RailwayLineLink::RailwayLineLink(const RailwayLine& rhs) 
: value_(rhs.value_) 
{ 
} 
+0

Regardez attentivement ... le paramètre 'data' est en fait de type' const RailwayLine & ', ce qui je pense que nous pouvons convenir est peut-être différent de' const RailwayLineLink & '. Bien que donné l'historique d'édition de la question, il pourrait bien s'agir d'une faute de frappe! * (EDIT: En parlant de fautes de frappe, j'en ai fait quelques uns ... D'oh!) * –

+0

Le questionneur n'est pas clair sur le constructeur de copie qui est appelé de façon inattendue: 'RailwayLine',' RailwayLineLink', ou 'RailwayLineList' –

+0

@Platinum: Ah, vous avez raison! J'ai totalement raté ça. –

Questions connexes