Bonjour,
je cherche à manipuler la copie d'un objet, grâce au code réduit suivant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
	CXmlFile f = _xml_file;
	f.SetTraversalMode(M_PRE_ORDER);
La méthode appelée reste bloquée dans une boucle infinie. Quand je manipule l'objet original:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
	CXmlFile &f = _xml_file;
	f.SetTraversalMode(M_PRE_ORDER);
le message est envoyé correctement; si mes souvenirs sont bons, lorsqu'on initialise un objet au moment de sa déclaration, c'est le constructeur de copie qui est utilisé (et non l'opérateur =). Je pensais que celui par défaut suffirait pour cette classe dont voici la définition:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
 
#ifndef	_CXMLFILE_H
#define	_CXMLFILE_H
 
#include <stack>
#include <queue>
#include "tinyxml.h"
 
 
enum
{
	M_PRE_ORDER,
	M_LEVEL_ORDER
};
 
typedef TiXmlNode	CXmlNode;
 
class	CXmlFile
{
public:
	CXmlFile() {}
	~CXmlFile() {}
 
public:
	CXmlNode		*Open(const char *file);
	CXmlNode		*NextNode();
	CXmlNode		*CurrentNode() {return _node;}
 
public:
	void			SetTraversalMode(const int mode);
 
private:
	void		init_node_stack();
	void		init_node_queue();
 
private:
	TiXmlDocument               _doc;
	CXmlNode                      *_node;
	std::stack<CXmlNode *>   _stack;
	std::queue<CXmlNode *>  _fifo;
	int                                 _mode;
 
public:
	static int              NodeDepth(const CXmlNode *node);
	static const char   *GetAttribute(const CXmlNode *node, const char *key);
};
 
 
#endif	// _CXMLFILE_H
J'y ai donc rajouté le constructeur de copie suivant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
CXmlFile(const CXmlFile &copy) : _doc(copy._doc), _node(copy._node), _stack(copy._stack), _fifo(copy._fifo), _mode(copy._mode) {}
Mais le problème de départ persiste (surement parce que le constructeur de copie généré par défaut doit être le meme que celui-ci)... j'avoue que c'est la première fois que je suis amené à créer un constructeur de copie à la mano. Quelqu'un pourrait m'aiguiller vers une solution?
Thx!