Probleme constructeur C++

Résolu/Fermé
feraudyh Messages postés 70 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 3 mars 2023 - 4 déc. 2009 à 12:22
feraudyh Messages postés 70 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 3 mars 2023 - 4 déc. 2009 à 16:22
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?

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 ?
0
feraudyh Messages postés 70 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 3 mars 2023 6
4 déc. 2009 à 12:49
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...
0
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
4 déc. 2009 à 13:40
Tu as raison, l'exemple que tu donnes conduit au désastre; c'est normal. Un exemple correct serait:
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 QPointF
Bonne réflexion.
0
feraudyh Messages postés 70 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 3 mars 2023 6
4 déc. 2009 à 13:06
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?
0
feraudyh Messages postés 70 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 3 mars 2023 6
4 déc. 2009 à 13:52
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.
0
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
4 déc. 2009 à 14:43
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.
0
feraudyh > loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017
4 déc. 2009 à 15:07
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.
0
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148 > feraudyh
4 déc. 2009 à 15:25
Un exemple:
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
feraudyh Messages postés 70 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 3 mars 2023 6
4 déc. 2009 à 16:22
Merci!
0