dbiare
Messages postés45Date d'inscriptionmercredi 30 novembre 2005StatutMembreDernière intervention 6 janvier 2006
-
8 déc. 2005 à 15:03
dbiare
Messages postés45Date d'inscriptionmercredi 30 novembre 2005StatutMembreDernière intervention 6 janvier 2006
-
12 déc. 2005 à 09:55
Bonjour
J'ai un petit souci en Visual C++6?
Je détiens, après traitement, deux indices (i et j) d'un même tableau d'objet : m_oaBras[].
Je dois permuter ces deux objets.
Si je déclare x comme étant un objet (comme ceux dans le tableau) et si j'écris :
x=m_oaBras[j];m_oaBras[j]=m_oaBras[i];m_oaBras[i]=x , bien évidement cela ne fonctionne pas. Normal !
Es-ce que quelqu'un peux me dire comment procéder ?
Merci d'avance
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 8 déc. 2005 à 22:31
Un autre problème important est celui de l'autoaffectation. Non seulement affecter un objet à lui-même est inutile et consommateur de ressources, mais en plus cela peut être dangereux. En effet, l'affectation risque de détruire les données membres de l'objet avant même qu'elles ne soient copiées, ce qui provoquerait en fin de compte simplement la destruction de l'objet !
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 9 déc. 2005 à 09:40
Ca "consommateur de ressources", c'est pas valable comme argument, deja
car copier un objet sur lui meme, ca doit pas etre fréquent, alors que
effectuer le test de comparaison a chaque fois que le constructeur de
copie est appelé, ca c'est une perte de tps inutile. Par contre, pour
ce qu'il dit ensuite, je comprend pas pourquoi il détruirait l'objet
membre avant de copier la valeur.
Quand tu fais
int x = 2;
x = 4; <= ici x ne va pas est détruit. Donc pourquoi, ce serait le cas pour les membres de la classe ?
Et si le test était vraiment vitale, il serait dans les includes du C++. Enfin je comprend pas bien.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 9 déc. 2005 à 10:40
La comparaison est une comparaison d'adresse, c'est donc très vite fait, et ca vaut largement le coup de la faire. A mon avis c'est une optimisation intéressante.
Voici ce que j'ai trouvé dans le template list de VC++:
_Myt& operator=(const _Myt& _Right)
{ // assign _Right
if (this != &_Right)
assign(_Right.begin(), _Right.end());
return (*this);
}
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 9 déc. 2005 à 19:39
Voici un exemple donné par l'auteur, qui justifie qu'on doit vérifier l'auto-affectation
class A
{
char *m_szData;
public:
A &operator=(const A &source)
{
// Libération de m_szData :
delete[] m_szData;
// Copie :
m_szData = new char[strlen(source.m_szData) + 1];
strcpy(m_szData, source.m_szData);
return *this;
}
...
};
A a("hello");
a = a; // Plantage.
En effet, a= a exécute, sans protection :
delete m_szData;
m_szData = new char[strlen(m_szData) + 1]; // m_szData n'est plus valide et
peut valoir n'importe quoi. Du coup strlen peut planter, ou la copie qui
suivra, etc.