Tu peux transférer une responsabilité en déplaçant celle-ci. Si tu ne connais pas la sémantique des movements, je t'invite à lire le tuto qui a été fait à ce sujet : Une nouvelle fonctionnalité de C++11 : la sémantique de mouvement. Je t'ai mis quelques exemples rapides en dessous pour que tu puisses voir comment l'utiliser dans ton cas.
En fait, tu vas simplement faire quasiment comme avec un pointeur nu, mais en faisant attention à ne jamais appeler le constructeur de copie (qui est supprimé).
Par exemple, si tu veux prendre une carte sur ton deck, tu vas faire quelque chose comme :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | class deck {
std::stack<std::unique_ptr<card>> stack;
std::unique_ptr<card> get_top() {
// on récupère la responsabilité
std::unique_ptr<card> c = std::move(stack.top());
// on supprime le haut de la pile
stack.pop();
// on transfère la responsabilité à l'appelant
return std::move(c);
}
}
int main() {
deck d;
// on remplis le deck...
// ici, deck.get_top() retourne un std::unique_ptr<card>&& qui est utilisé pour construire c
std::unique_ptr<card> c = deck.get_top();
}
|
Tu vas donc devoir appeler std::move
quand tu veux récupérer la responsabilité d'un pointeur et la transférer.
Dans le cas où tu voudrais échanger deux cartes, il y a aussi std::swap
:
| std::vector<card> deck1;
std::vector<card> deck2;
// échange la première carte des deux decks
std::swap(deck1[0], deck2[0]);
// équivalent à
std::unique_ptr<card> tmp = std::move(deck1[0]);
deck1[0] = std::move(deck2[0]);
deck2[0] = std::move(tmp);
|
Attention, une fois que tu as déplacé la responsabilité (avec std::move
), il ne faut surtout pas utiliser l'ancien pointeur. Il est donc préférable qu'il soit détruit assez rapidement.
EDIT : et j'allais oublier, pour ajouter une carte en haut de ton deck, c'est aussi un poil particulier.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | class deck {
std::stack<std::unique_ptr<card>> stack;
void put_top(std::unique_ptr<card> &&c) {
stack.push(std::move(c));
}
}
int main() {
std::unique_ptr<card> c;
deck d;
// tu met ce que tu veux pour la carte et le deck
d.put_top(std::move(c));
// à partir d'ici, il ne faut plus utiliser c
}
|