Probleme constructeur C++
Résolu
feraudyh
Messages postés
70
Date d'inscription
Statut
Membre
Dernière intervention
-
feraudyh Messages postés 70 Date d'inscription Statut Membre Dernière intervention -
feraudyh Messages postés 70 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je veux définir une classe Point qui utilise une autre classe QPointF de la bibliotheque Qt pour un membre m_qPoint. Je définis un constructeur Point(float x, float y) qui doit affecter une instance de QPointF à m_qPoint.
Je pense au code suivant:
Point::Point(float x, float y)
{
m_qPoint = QPointF(x,y);
...
}
seulement là j'ai un gros doute.
L'appel de QPointF(x,y) ne crée-t-il pas un objet provisoire (sur la pile? qui n'a plus de sens des qu'on quitte le constructeur?
Je veux définir une classe Point qui utilise une autre classe QPointF de la bibliotheque Qt pour un membre m_qPoint. Je définis un constructeur Point(float x, float y) qui doit affecter une instance de QPointF à m_qPoint.
Je pense au code suivant:
Point::Point(float x, float y)
{
m_qPoint = QPointF(x,y);
...
}
seulement là j'ai un gros doute.
L'appel de QPointF(x,y) ne crée-t-il pas un objet provisoire (sur la pile? qui n'a plus de sens des qu'on quitte le constructeur?
A voir également:
- Probleme constructeur C++
- Constructeur automobile - Guide
- Adresse mac constructeur - Guide
- Constructeur agrandissement maison - Guide
- JAVA - Constructeur variable??? - Forum Java
- Garantie constructeur Lenovo - Forum Matériel & Système
5 réponses
Bonjour,
L'appel à QPointF(x,y) va effectivement effectuer une allocation en mémoire.
Mais je ne comprend pas ta question : "qui n'a plus de sens des qu'on quitte le constructeur?"
Que veux tu dire par "n'a plus de sens" ?
Le m_qPoint est-il déclaré dans le constructeur ou dans les données de la classe ?
L'appel à QPointF(x,y) va effectivement effectuer une allocation en mémoire.
Mais je ne comprend pas ta question : "qui n'a plus de sens des qu'on quitte le constructeur?"
Que veux tu dire par "n'a plus de sens" ?
Le m_qPoint est-il déclaré dans le constructeur ou dans les données de la classe ?
Merci de ta réponse.
m_qPoint est un champ privé de la classe Point.
Voici ce qui motive ma crainte:
Si je définit la fonction
char *toto{ char s[50]; return s;}
alors l'utilisation
char *s2 = toto();
strcpy(s2,"titi");
est désastreux car la valeur de retour était allouée dans la pile et dans l'appel de strcpy n'a "plus de sens" dans
le sens qu'elle pointe sur une partie de la pile. qui n'est plus valide: ce code peux faire planter le programme.
Or comme dans mon constructeur j'ai un appel à QPointF(x,y) je me demande où alloue la mémoire pour l'instance de QPointF : sur la pile ou dans le tas, ou selon le cas...
m_qPoint est un champ privé de la classe Point.
Voici ce qui motive ma crainte:
Si je définit la fonction
char *toto{ char s[50]; return s;}
alors l'utilisation
char *s2 = toto();
strcpy(s2,"titi");
est désastreux car la valeur de retour était allouée dans la pile et dans l'appel de strcpy n'a "plus de sens" dans
le sens qu'elle pointe sur une partie de la pile. qui n'est plus valide: ce code peux faire planter le programme.
Or comme dans mon constructeur j'ai un appel à QPointF(x,y) je me demande où alloue la mémoire pour l'instance de QPointF : sur la pile ou dans le tas, ou selon le cas...
Tu as raison, l'exemple que tu donnes conduit au désastre; c'est normal. Un exemple correct serait:
Dans ton cas ne serait-il pas plus judicieux de dériver la classe QPointF, par exemple:
char* toto (void) { char* s = malloc(50); ... return (s); }D'autre part, il y a une erreur dans ton constructeur, il faut déclarer:
m_qPoint = new QPointF(x,y);ce qui revient en fait à faire un 'malloc' sur la classe.
Dans ton cas ne serait-il pas plus judicieux de dériver la classe QPointF, par exemple:
class Point : public QPointFBonne réflexion.
Je viens de penser à un petit détail:
Dans l'affectation du constructeur, il s'agit de faire une copie de la valeur de retour du constructeur de QPointF,
donc le probleme finalement disaparaitrait, non?
Dans l'affectation du constructeur, il s'agit de faire une copie de la valeur de retour du constructeur de QPointF,
donc le probleme finalement disaparaitrait, non?
Le probleme de
m_qPoint = new QPointF(x,y);
c'est qu'à gauche nous avons le type QPointF et à droite le type (QPointF *)
dont je doute que ca marche.
Quant à dériver Point de QPointF, c'est intéressant.
m_qPoint = new QPointF(x,y);
c'est qu'à gauche nous avons le type QPointF et à droite le type (QPointF *)
dont je doute que ca marche.
Quant à dériver Point de QPointF, c'est intéressant.
C'est sûr que ça ne peut pas marcher.
On ne connait pas ta déclarartion de m_qPoint, mais si as déclaré: QPointF m_qPoint, alors il est inutile de faire: m_qPoint = QPointF(x,y); il faut simplement utiliser les méthodes setX et setY.
Quant à dériver Point de QPointF, c'est intéressant
Intéressant, certes, mais surtout une des principales raisons d'utiliser C++ !
Bonne continuation.
On ne connait pas ta déclarartion de m_qPoint, mais si as déclaré: QPointF m_qPoint, alors il est inutile de faire: m_qPoint = QPointF(x,y); il faut simplement utiliser les méthodes setX et setY.
Quant à dériver Point de QPointF, c'est intéressant
Intéressant, certes, mais surtout une des principales raisons d'utiliser C++ !
Bonne continuation.
Ma déclaration de m_qPoint est QPointF m_qPoint;
Au fait je m'intéresse à l'utilisation de l'héritage.
Je crois que vous avez compris que je n'ai pas lu toute la doc C++: mon livre est énorme et je ne sais pas si j'ai le temps de parcourir tout cela dans l'immédiat (je suis sous préssion)...
Imaginons que je dérive Point de QPointF et d'un autre classe alors comment créer le constructeur de
Point afin qu'il utilise le constructeur de QPointF?
Je me permets de vous demander parce que je suis presque sur que la réponse est très courte.
Au fait je m'intéresse à l'utilisation de l'héritage.
Je crois que vous avez compris que je n'ai pas lu toute la doc C++: mon livre est énorme et je ne sais pas si j'ai le temps de parcourir tout cela dans l'immédiat (je suis sous préssion)...
Imaginons que je dérive Point de QPointF et d'un autre classe alors comment créer le constructeur de
Point afin qu'il utilise le constructeur de QPointF?
Je me permets de vous demander parce que je suis presque sur que la réponse est très courte.
Un exemple:
Point p(1,2); ou Point p();
puis:
double abscisse = p.x();
double ordonnee = p.y();
Bienvenue dans le monde du C++ et bonne continuation.
class Point : public QPointF { public: Point (double x=0, double y=0); ... } Point::Point (double x, double y) : QPointF(x, y) { ... }C'est tout. Tu pourras utiliser les méthodes de la classe QPointF, par exemple les coordonnées:
Point p(1,2); ou Point p();
puis:
double abscisse = p.x();
double ordonnee = p.y();
Bienvenue dans le monde du C++ et bonne continuation.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question