tu dois savoir une, pour utiliser la sémantique de mouvement, tu dois être sur que ton constructeur et opérateur de mouvement tous deux ne doivent pas renvoyer une ou des erreurs, voila pour quoi on utilise le mot clé " noexcept ":
class X{
// tu implémente les autres constructeur et ton destructeur
X(X const&& copie) noexcept;
X& operator=(X const&& copie)noexcept;
}
prochainement évite d'utiliser un pointeur nue préfère plutôt utiliser un " unique_ptr " ce mieux et facile .
- Edité par EL-jos 19 mars 2018 à 13:43:13
Ton présent détermine ton futur et la connaissance te placera au dessus de ta génération .
PS: La sémantique de mouvement sur une classe ayant une sémantique de valeur, je ne suis pas convaincu que ce soit utile.
Et si tu veux mieux comprendre la sémantique de mouvement, cette implémentation très simplifiée de la fonction move() devrait t'y aider:
class data
{
private:
int* mPtr;
public:
data(): mPtr{new int}
{
}
friend data move(data& in);
}
data move(data& in)
{
data out;
delete out.mPtr;
// out pointe sur in
out.mPtr = in.mPtr;
// in ne pointe plus sur rien
in.mPtr = nullPtr
return out;
}
PS: La sémantique de mouvement sur une classe ayant une sémantique de valeur, je ne suis pas convaincu que ce soit utile.
Et si tu veux mieux comprendre la sémantique de mouvement, cette implémentation très simplifiée de la fonction move() devrait t'y aider:
class data
{
private:
int* mPtr;
public:
data(): mPtr{new int}
{
}
friend data move(data& in);
}
data move(data& in)
{
data out;
delete out.mPtr;
// out pointe sur in
out.mPtr = in.mPtr;
// in ne pointe plus sur rien
in.mPtr = nullPtr
return out;
}
- Edité par Deedolith il y a 39 minutes
Oui mais j'avais déjà essayer de passer par adresse mais sans succès, exemple:
std::ostream& operator<<(std::ostream& flux, X const& a){
a.afficher(flux); // sachant que j'avais définie une méthode afficher(std::ostream& flux) dans ma classe X
retrun flux;
}
pour ton exemple, en examinant, j'ai remarqué que cela fait la meme chose que la fonction std::exchange (C++11) que j'ai utilisé dans mon code
j'ai résolue le problème car il était au niveau de fichier .o donc il fallait le supprimer puis faire une ré-compilation, alors maintenant ça marche parfaitement bien.
mais juste une question:
comme faire un déplacement manuellement ou lieu de laisser la charge au compilateur, je m'explique :
je voudrai faire faire appelle à mon constructeur ou opérateur de déplacement , exemple :
X a("toto", 5), b;
b = a;
donc que a soit déplacer dans b sans laissé la tache au compilo
Oui mais j'avais déjà essayer de passer par adresse mais sans succès, exemple:
std::ostream& operator<<(std::ostream& flux, X const& a)
{
a.afficher(flux); // sachant que j'avais définie une méthode afficher(std::ostream& flux) dans ma classe X
retrun flux;
}
pour ton exemple, en examinant, j'ai remarqué que cela fait la meme chose que la fonction std::exchange (C++11) que j'ai utilisé dans mon code
Loupé, ce n'est pas du passage de paramètre par adresse, mais par référence. Et c'est la forme indiquée dans la documentation. Donc soit bête, et applique la sans te poser de questions.
Ensuite ton code devrais plutôt ressembler à ceci:
std::ostream& operator<<(std::ostream& flux, X const& a){
flux << a.m_mot << *(a.m_ptr); // affiche le mot et la valeur pointée
retrun flux;
}
Une fonction membre "afficher" au sein de la classe viole le SRP, c'est rarement de la responsabilité de la classe de s'afficher elle-même, elle a d'autres chats à fouetter.
MoiMoi134 a écrit:
je voudrai faire faire appelle à mon constructeur ou opérateur de déplacement , exemple :
X a("toto", 5), b;
b = a;
donc que a soit déplacer dans b sans laissé la tache au compilo
Tout simplement:
X a("toto", 5)
X b = std::move(a);
Mais garde bien en tête que le contenu de l'objet déplacé est invalidé. Continuer à l'utiliser est un comportement indéterminé.
Deedolith, merci beaucoup pour ton éclaircissement mais j'avais trouvé une astuce donc c'est de déclarer operator<< comme ami à la classe avoue que géniale comme idée.
mais encore une autre question par-apport à ta portion de code, tel que:
X a("toto", 5)
X b = std::move(a);
donc si tu me recommande d'utiliser directement std::move() dans mon main donc cela ne sert à rien de créer un constructeur et un opérateur par de mouvement ?
je me tape trop les doigts pour créer un constructeur et un opérateur par mouvement
Deedolith, merci beaucoup pour ton éclaircissement mais j'avais trouvé une astuce donc c'est de déclarer operator<< comme ami à la classe avoue que géniale comme idée.
C'est exactement ce qui est écrit dans la doc (l'as-tu lue ?)
The overloads of operator>> and operator<< that take a std::istream& or std::ostream& as the left hand argument are known as insertion and extraction operators. Since they take the user-defined type as the right argument (b in a@b), they must be implemented as non-members.
MoiMoi134 a écrit:
mais encore une autre question par-apport à ta portion de code, tel que:
X a("toto", 5)
X b = std::move(a);
donc si tu me recommande d'utiliser directement std::move() dans mon main donc cela ne sert à rien de créer un constructeur et un opérateur par de mouvement ?
je me tape trop les doigts pour créer un constructeur et un opérateur par mouvement
Dans ton cas particulier, a cause du pointeur nu, tu dois en implémenter un.
ah d'accord merci beaucoup pour votre aide, Deedolith et EL-jos ,
encore Merci
operateur << avec Visual Studio 2017
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Ton présent détermine ton futur et la connaissance te placera au dessus de ta génération .
Ton présent détermine ton futur et la connaissance te placera au dessus de ta génération .
Ton présent détermine ton futur et la connaissance te placera au dessus de ta génération .