Parce que le new() que j'utilise pour créer mon objet me retourne un
pointeur ...
Parce que le new() que j'utilise pour créer mon objet me retourne un
pointeur ...
Parce que le new() que j'utilise pour créer mon objet me retourne un
pointeur ...
On Tue, 27 Jan 2009 14:31:26 +0100, No_Name :Parce que le new() que j'utilise pour créer mon objet me retourne un
pointeur ...
Mais typiquement, ce que new renvoie, on le stocke dans un pointeur
intelligent, pour éviter les fuites mémoire.
(Je dis "typiquement", car certains objets se détruisent tout seuls.)
Et question subsidiaire : pourquoi new est-il utilisé ici ?
Au moins dans le cadre de ce thread, ça ne fait que compliquer le
problème.
Cherche d'abord à bien comprendre les mécanismes de passage entre B et
C avec des objets normaux, et ensuite seulement, tu pourras ajouter,
si nécessaire, les complications liées à l'allocation dynamique.
On Tue, 27 Jan 2009 14:31:26 +0100, No_Name <no_mail@no_mail.com>:
Parce que le new() que j'utilise pour créer mon objet me retourne un
pointeur ...
Mais typiquement, ce que new renvoie, on le stocke dans un pointeur
intelligent, pour éviter les fuites mémoire.
(Je dis "typiquement", car certains objets se détruisent tout seuls.)
Et question subsidiaire : pourquoi new est-il utilisé ici ?
Au moins dans le cadre de ce thread, ça ne fait que compliquer le
problème.
Cherche d'abord à bien comprendre les mécanismes de passage entre B et
C avec des objets normaux, et ensuite seulement, tu pourras ajouter,
si nécessaire, les complications liées à l'allocation dynamique.
On Tue, 27 Jan 2009 14:31:26 +0100, No_Name :Parce que le new() que j'utilise pour créer mon objet me retourne un
pointeur ...
Mais typiquement, ce que new renvoie, on le stocke dans un pointeur
intelligent, pour éviter les fuites mémoire.
(Je dis "typiquement", car certains objets se détruisent tout seuls.)
Et question subsidiaire : pourquoi new est-il utilisé ici ?
Au moins dans le cadre de ce thread, ça ne fait que compliquer le
problème.
Cherche d'abord à bien comprendre les mécanismes de passage entre B et
C avec des objets normaux, et ensuite seulement, tu pourras ajouter,
si nécessaire, les complications liées à l'allocation dynamique.
No_Name wrote:Le but de tout cela est de permettre un "undo", c'est à dire l'annulation
des choix du client.
Disons que le client fait un premier choix. On va donc générer en mémoire
un objet de type B correspondant à son choix.
Ensuite il sélectionne une option. C'est là que je suis amené à passer d'un
objet de type B à un objet de type C, correspondant à cette option.
Puis le client change d'idée et annule son choix. On doit alors revenir à
un objet de type B, d'où l'option est retirée.
Voilà la raison des manipulations auxquelles je me livre ...
Voyez vous éventuellement une autre façon (un autre design ?) de réaliser
le même type de traitements et d'offrir le même genre de possibilités ?
Ca dépends à quoi sers le choix du client et quel est le workflow. Faire
correspondre un type à un choix du client me parait pas très évolutif. En
plus ça mélange des opération business (appuyer un bouton) et design
(hierarchie de classe).
En général, un undo/redo est implémenté en terme de "memento" ou de
"command". Le fait que tu parles d'option me laisse penser qu'il s'agit d'un
mécanisme de "décoration" ou de "stratégie".
Si les combinaison d'option sont complexes, il y aura peut être lieu d'avoir
un système de "builder".
Voilà, c'est très générique mais ça me fait 5 points GOF :)
No_Name wrote:
Le but de tout cela est de permettre un "undo", c'est à dire l'annulation
des choix du client.
Disons que le client fait un premier choix. On va donc générer en mémoire
un objet de type B correspondant à son choix.
Ensuite il sélectionne une option. C'est là que je suis amené à passer d'un
objet de type B à un objet de type C, correspondant à cette option.
Puis le client change d'idée et annule son choix. On doit alors revenir à
un objet de type B, d'où l'option est retirée.
Voilà la raison des manipulations auxquelles je me livre ...
Voyez vous éventuellement une autre façon (un autre design ?) de réaliser
le même type de traitements et d'offrir le même genre de possibilités ?
Ca dépends à quoi sers le choix du client et quel est le workflow. Faire
correspondre un type à un choix du client me parait pas très évolutif. En
plus ça mélange des opération business (appuyer un bouton) et design
(hierarchie de classe).
En général, un undo/redo est implémenté en terme de "memento" ou de
"command". Le fait que tu parles d'option me laisse penser qu'il s'agit d'un
mécanisme de "décoration" ou de "stratégie".
Si les combinaison d'option sont complexes, il y aura peut être lieu d'avoir
un système de "builder".
Voilà, c'est très générique mais ça me fait 5 points GOF :)
No_Name wrote:Le but de tout cela est de permettre un "undo", c'est à dire l'annulation
des choix du client.
Disons que le client fait un premier choix. On va donc générer en mémoire
un objet de type B correspondant à son choix.
Ensuite il sélectionne une option. C'est là que je suis amené à passer d'un
objet de type B à un objet de type C, correspondant à cette option.
Puis le client change d'idée et annule son choix. On doit alors revenir à
un objet de type B, d'où l'option est retirée.
Voilà la raison des manipulations auxquelles je me livre ...
Voyez vous éventuellement une autre façon (un autre design ?) de réaliser
le même type de traitements et d'offrir le même genre de possibilités ?
Ca dépends à quoi sers le choix du client et quel est le workflow. Faire
correspondre un type à un choix du client me parait pas très évolutif. En
plus ça mélange des opération business (appuyer un bouton) et design
(hierarchie de classe).
En général, un undo/redo est implémenté en terme de "memento" ou de
"command". Le fait que tu parles d'option me laisse penser qu'il s'agit d'un
mécanisme de "décoration" ou de "stratégie".
Si les combinaison d'option sont complexes, il y aura peut être lieu d'avoir
un système de "builder".
Voilà, c'est très générique mais ça me fait 5 points GOF :)
No_Name a écrit :
Par contre, pour le passage de C vers B, j'ai testé :
B *cq(C);
??ou bien : B *cq = static_cast<B *>(cqc); (avec cqc pointant vers un objet
de type C)
mais à chaque fois, d'après le débuggeur, j'obtiens le même résultat : cq
pointe vers un objet bizarre, qui est un objet de type C auquel s'ajoutent
les propriétés d'un objet de type B.
c'est quoi "bizarre" ?
C hérite de B et Z, l'héritage multiple implique une composition
des tables des méthodes virtuelles de B et de C; caster un C* en B*
retourne ici un pointeur sur la zone où "commence" B dans cette
composition (cela peut être strictement l'adresse de B).
ce cast de *pointeur* est à 99% inutile car partout où ce 'cq'
sera utilisé le pointeur d'origine 'cqc' pourra l'être.
ta démarche est dès lors non claire.Alors que mon but et d'obtenir un objet de type B à partir d'un
objet de type C, en perdant bien entendu les propriétés
supplémentaires qui font que C est une spécialisation de B.
ce que ne fait pas du tout un cas de pointeur, une adresse est
une adresse est une adresse.
si tu veux *créer* un objet B à partir de d'un C, il faut bien
le *créer*, soit B b = *cqc; ( ou B b(*cqc); )
Sylvain.
No_Name a écrit :
Par contre, pour le passage de C vers B, j'ai testé :
B *cq(C);
??
ou bien : B *cq = static_cast<B *>(cqc); (avec cqc pointant vers un objet
de type C)
mais à chaque fois, d'après le débuggeur, j'obtiens le même résultat : cq
pointe vers un objet bizarre, qui est un objet de type C auquel s'ajoutent
les propriétés d'un objet de type B.
c'est quoi "bizarre" ?
C hérite de B et Z, l'héritage multiple implique une composition
des tables des méthodes virtuelles de B et de C; caster un C* en B*
retourne ici un pointeur sur la zone où "commence" B dans cette
composition (cela peut être strictement l'adresse de B).
ce cast de *pointeur* est à 99% inutile car partout où ce 'cq'
sera utilisé le pointeur d'origine 'cqc' pourra l'être.
ta démarche est dès lors non claire.
Alors que mon but et d'obtenir un objet de type B à partir d'un
objet de type C, en perdant bien entendu les propriétés
supplémentaires qui font que C est une spécialisation de B.
ce que ne fait pas du tout un cas de pointeur, une adresse est
une adresse est une adresse.
si tu veux *créer* un objet B à partir de d'un C, il faut bien
le *créer*, soit B b = *cqc; ( ou B b(*cqc); )
Sylvain.
No_Name a écrit :
Par contre, pour le passage de C vers B, j'ai testé :
B *cq(C);
??ou bien : B *cq = static_cast<B *>(cqc); (avec cqc pointant vers un objet
de type C)
mais à chaque fois, d'après le débuggeur, j'obtiens le même résultat : cq
pointe vers un objet bizarre, qui est un objet de type C auquel s'ajoutent
les propriétés d'un objet de type B.
c'est quoi "bizarre" ?
C hérite de B et Z, l'héritage multiple implique une composition
des tables des méthodes virtuelles de B et de C; caster un C* en B*
retourne ici un pointeur sur la zone où "commence" B dans cette
composition (cela peut être strictement l'adresse de B).
ce cast de *pointeur* est à 99% inutile car partout où ce 'cq'
sera utilisé le pointeur d'origine 'cqc' pourra l'être.
ta démarche est dès lors non claire.Alors que mon but et d'obtenir un objet de type B à partir d'un
objet de type C, en perdant bien entendu les propriétés
supplémentaires qui font que C est une spécialisation de B.
ce que ne fait pas du tout un cas de pointeur, une adresse est
une adresse est une adresse.
si tu veux *créer* un objet B à partir de d'un C, il faut bien
le *créer*, soit B b = *cqc; ( ou B b(*cqc); )
Sylvain.
Par contre, pour le passage de C vers B, j'ai testé :
B *cq(C);
ou bien : B *cq = static_cast<B *>(cqc); (avec cqc pointant vers un
objet de type C)
mais à chaque fois, d'après le débuggeur, j'obtiens le même résultat :
cq pointe vers un objet bizarre, qui est un objet de type C auquel
s'ajoutent les propriétés d'un objet de type B.
Alors que mon but et d'obtenir un objet de type B à partir d'un
objet de type C, en perdant bien entendu les propriétés
supplémentaires qui font que C est une spécialisation de B.
Par contre, pour le passage de C vers B, j'ai testé :
B *cq(C);
ou bien : B *cq = static_cast<B *>(cqc); (avec cqc pointant vers un
objet de type C)
mais à chaque fois, d'après le débuggeur, j'obtiens le même résultat :
cq pointe vers un objet bizarre, qui est un objet de type C auquel
s'ajoutent les propriétés d'un objet de type B.
Alors que mon but et d'obtenir un objet de type B à partir d'un
objet de type C, en perdant bien entendu les propriétés
supplémentaires qui font que C est une spécialisation de B.
Par contre, pour le passage de C vers B, j'ai testé :
B *cq(C);
ou bien : B *cq = static_cast<B *>(cqc); (avec cqc pointant vers un
objet de type C)
mais à chaque fois, d'après le débuggeur, j'obtiens le même résultat :
cq pointe vers un objet bizarre, qui est un objet de type C auquel
s'ajoutent les propriétés d'un objet de type B.
Alors que mon but et d'obtenir un objet de type B à partir d'un
objet de type C, en perdant bien entendu les propriétés
supplémentaires qui font que C est une spécialisation de B.
Le but de tout cela est de permettre un "undo", c'est à dire l'annulation des choix du client.
Disons que le client fait un premier choix. On va donc générer en mémoire un objet de type B correspondant à son choix.
Ensuite il sélectionne une option. C'est là que je suis amené à passer d'un objet de type B à un objet de type C, correspondant à cette option.
Puis le client change d'idée et annule son choix. On doit alors revenir à un objet de type B, d'où l'option est retirée.
Voilà la raison des manipulations auxquelles je me livre ...
Voyez vous éventuellement une autre façon (un autre design ?) de
réaliser le même type de traitements et d'offrir le même genre de
possibilités ?
Le but de tout cela est de permettre un "undo", c'est à dire l'annulation des choix du client.
Disons que le client fait un premier choix. On va donc générer en mémoire un objet de type B correspondant à son choix.
Ensuite il sélectionne une option. C'est là que je suis amené à passer d'un objet de type B à un objet de type C, correspondant à cette option.
Puis le client change d'idée et annule son choix. On doit alors revenir à un objet de type B, d'où l'option est retirée.
Voilà la raison des manipulations auxquelles je me livre ...
Voyez vous éventuellement une autre façon (un autre design ?) de
réaliser le même type de traitements et d'offrir le même genre de
possibilités ?
Le but de tout cela est de permettre un "undo", c'est à dire l'annulation des choix du client.
Disons que le client fait un premier choix. On va donc générer en mémoire un objet de type B correspondant à son choix.
Ensuite il sélectionne une option. C'est là que je suis amené à passer d'un objet de type B à un objet de type C, correspondant à cette option.
Puis le client change d'idée et annule son choix. On doit alors revenir à un objet de type B, d'où l'option est retirée.
Voilà la raison des manipulations auxquelles je me livre ...
Voyez vous éventuellement une autre façon (un autre design ?) de
réaliser le même type de traitements et d'offrir le même genre de
possibilités ?
Fabien LE LEZ a utilisé son clavier pour écrire :On Tue, 27 Jan 2009 14:31:26 +0100, No_Name :Parce que le new() que j'utilise pour créer mon objet me retourne
un pointeur ...
Mais typiquement, ce que new renvoie, on le stocke dans un pointeur
intelligent, pour éviter les fuites mémoire.
(Je dis "typiquement", car certains objets se détruisent tout seuls.)
Et question subsidiaire : pourquoi new est-il utilisé ici ?
Au moins dans le cadre de ce thread, ça ne fait que compliquer le
problème.
Cherche d'abord à bien comprendre les mécanismes de passage entre B et
C avec des objets normaux, et ensuite seulement, tu pourras ajouter,
si nécessaire, les complications liées à l'allocation dynamique.
En effet, mais la question que je posais s'inscrivait dans un
véritable projet. Il ne s'agit pas d'un exercice de style, et il me
faut bien adapter les réponses qui m'ont été faites à la réalité de
mon code.
Merci encore pour vos réponses qui m'ont permis de régler le problème.
Fabien LE LEZ a utilisé son clavier pour écrire :
On Tue, 27 Jan 2009 14:31:26 +0100, No_Name <no_mail@no_mail.com>:
Parce que le new() que j'utilise pour créer mon objet me retourne
un pointeur ...
Mais typiquement, ce que new renvoie, on le stocke dans un pointeur
intelligent, pour éviter les fuites mémoire.
(Je dis "typiquement", car certains objets se détruisent tout seuls.)
Et question subsidiaire : pourquoi new est-il utilisé ici ?
Au moins dans le cadre de ce thread, ça ne fait que compliquer le
problème.
Cherche d'abord à bien comprendre les mécanismes de passage entre B et
C avec des objets normaux, et ensuite seulement, tu pourras ajouter,
si nécessaire, les complications liées à l'allocation dynamique.
En effet, mais la question que je posais s'inscrivait dans un
véritable projet. Il ne s'agit pas d'un exercice de style, et il me
faut bien adapter les réponses qui m'ont été faites à la réalité de
mon code.
Merci encore pour vos réponses qui m'ont permis de régler le problème.
Fabien LE LEZ a utilisé son clavier pour écrire :On Tue, 27 Jan 2009 14:31:26 +0100, No_Name :Parce que le new() que j'utilise pour créer mon objet me retourne
un pointeur ...
Mais typiquement, ce que new renvoie, on le stocke dans un pointeur
intelligent, pour éviter les fuites mémoire.
(Je dis "typiquement", car certains objets se détruisent tout seuls.)
Et question subsidiaire : pourquoi new est-il utilisé ici ?
Au moins dans le cadre de ce thread, ça ne fait que compliquer le
problème.
Cherche d'abord à bien comprendre les mécanismes de passage entre B et
C avec des objets normaux, et ensuite seulement, tu pourras ajouter,
si nécessaire, les complications liées à l'allocation dynamique.
En effet, mais la question que je posais s'inscrivait dans un
véritable projet. Il ne s'agit pas d'un exercice de style, et il me
faut bien adapter les réponses qui m'ont été faites à la réalité de
mon code.
Merci encore pour vos réponses qui m'ont permis de régler le problème.
Le but de tout cela est de permettre un "undo", c'est à dire
l'annulation des choix du client.
Disons que le client fait un premier choix. On va donc générer en
mémoire un objet de type B correspondant à son choix.
Ensuite il sélectionne une option. C'est là que je suis amené à passer
d'un objet de type B à un objet de type C, correspondant à cette
option.
Puis le client change d'idée et annule son choix. On doit alors
revenir à un objet de type B, d'où l'option est retirée.
Voilà la raison des manipulations auxquelles je me livre ...
Le but de tout cela est de permettre un "undo", c'est à dire
l'annulation des choix du client.
Disons que le client fait un premier choix. On va donc générer en
mémoire un objet de type B correspondant à son choix.
Ensuite il sélectionne une option. C'est là que je suis amené à passer
d'un objet de type B à un objet de type C, correspondant à cette
option.
Puis le client change d'idée et annule son choix. On doit alors
revenir à un objet de type B, d'où l'option est retirée.
Voilà la raison des manipulations auxquelles je me livre ...
Le but de tout cela est de permettre un "undo", c'est à dire
l'annulation des choix du client.
Disons que le client fait un premier choix. On va donc générer en
mémoire un objet de type B correspondant à son choix.
Ensuite il sélectionne une option. C'est là que je suis amené à passer
d'un objet de type B à un objet de type C, correspondant à cette
option.
Puis le client change d'idée et annule son choix. On doit alors
revenir à un objet de type B, d'où l'option est retirée.
Voilà la raison des manipulations auxquelles je me livre ...
On Tue, 27 Jan 2009 11:32:11 +0100, Michael DOUBEZ
:
>En supposant que B ait un constructeur par copie.
Y a-t-il des cas où une classe n'a pas de constructeur par
copie ?
On Tue, 27 Jan 2009 11:32:11 +0100, Michael DOUBEZ
<michael.dou...@free.fr>:
>En supposant que B ait un constructeur par copie.
Y a-t-il des cas où une classe n'a pas de constructeur par
copie ?
On Tue, 27 Jan 2009 11:32:11 +0100, Michael DOUBEZ
:
>En supposant que B ait un constructeur par copie.
Y a-t-il des cas où une classe n'a pas de constructeur par
copie ?
On Tue, 27 Jan 2009 14:31:26 +0100, No_Name :
>Parce que le new() que j'utilise pour créer mon objet me
>retourne un pointeur ...
Mais typiquement, ce que new renvoie, on le stocke dans un
pointeur intelligent, pour éviter les fuites mémoire.
(Je dis "typiquement", car certains objets se détruisent tout seuls.)
Et question subsidiaire : pourquoi new est-il utilisé ici ?
On Tue, 27 Jan 2009 14:31:26 +0100, No_Name <no_mail@no_mail.com>:
>Parce que le new() que j'utilise pour créer mon objet me
>retourne un pointeur ...
Mais typiquement, ce que new renvoie, on le stocke dans un
pointeur intelligent, pour éviter les fuites mémoire.
(Je dis "typiquement", car certains objets se détruisent tout seuls.)
Et question subsidiaire : pourquoi new est-il utilisé ici ?
On Tue, 27 Jan 2009 14:31:26 +0100, No_Name :
>Parce que le new() que j'utilise pour créer mon objet me
>retourne un pointeur ...
Mais typiquement, ce que new renvoie, on le stocke dans un
pointeur intelligent, pour éviter les fuites mémoire.
(Je dis "typiquement", car certains objets se détruisent tout seuls.)
Et question subsidiaire : pourquoi new est-il utilisé ici ?