Aucune fonction correspondante pour appeler le Constructeur de la Classe
Je suis de pratiquer mon POO et j'ai les classes suivantes: le Point et le Cercle. Plus précisément, le Cercle a un centre et un rayon. Voici le code correspondant:
//Point.h
class Point
{
public:
Point(double x, double y);
double x() const;
double y() const;
std::string as_string() const;
private:
double x_coord;
double y_coord;
};
//Circle.h
class Circle
{
public:
Circle(const Point& center, double radius);
Point center() const;
double radius() const;
std::string as_string() const;
std::string equation() const;
private:
Point center_pt;
double radius_size;
};
//Circle.cpp
Circle::Circle(const Point& center, double radius)
{
center_pt = center;
radius_size = radius;
}
Cependant, lorsque j'essaie de compiler ce code, j'obtiens l'erreur suivante:
Circle.cpp: In constructor ‘Circle::Circle(const Point&, double)’:
Circle.cpp:3: error: no matching function for call to ‘Point::Point()’
Point.h:10: note: candidates are: Point::Point(double, double)
Point.h:8: note: Point::Point(const Point&)
Je ne suis pas sûr de savoir comment interpréter cette erreur. Est-il me dire que je dois fournir le x_coord et y_coord pour le paramètre de Point dans mon Cercle constructeur?
Définir explicitement un constructeur par défaut pour la classe point.
OriginalL'auteur nonremovable | 2015-07-03
Vous devez vous connecter pour publier un commentaire.
Le membre
center_pt
est initialisé par défaut et une telle opération va appeler le pas d'arguments constructeur par défautPoint()
. Ce n'est cependant pas définie dans laPoint
de la classe et, par conséquent, vous donne l'erreur que vous avez obtenu.Avant que vous pouvez assigner à
center_pt
ici, vous besoin de quelque chose pour céder à. Le compilateur cherche donc à s'initialiser par défautcenter_pt
pour vous d'abord avant d'essayer de le refaire.Au lieu de cela, si vous utilisez le membre de la liste d'initialiseur vous pouvez éviter le problème de la valeur par défaut de la construction suivie par affectation:
Lorsque vous créez une classe, vous êtes essentiellement de la mise de côté de la mémoire pour stocker les différents membres de cette classe. Alors, imaginez
center_pt
etradius_size
comme des lieux dans la mémoire que les valeurs enregistrées pour chaque instance de votre classe. Lorsque vous créez une classe de ces variables ont à obtenir compte tenu de certaines valeurs par défaut, si vous ne spécifiez rien, vous obtenez la valeur par défaut valeurs construites, quelle que soit ceux sont. Vous pouvez affecter des valeurs plus tard, à ces endroits, mais certains d'initialisation se produit toujours au moment de la création de classes. Si vous utilisez l'initialiseur de liste, vous obtenez de spécifier explicitement ce qui est placé dans la mémoire la première fois autour.En utilisant l'initialiseur de membre ici la liste de vos membres sont en train d'être construit de façon appropriée la première fois autour. Il a également l'avantage d'économiser des opérations inutiles.
Lorsque vous créez une classe, vous êtes essentiellement de la mise de côté de la mémoire pour stocker les différents membres de cette classe. Alors, imaginez
center_pt
etradius_size
comme des lieux dans la mémoire que ces valeurs sont enregistrées dans le. Lorsque se produit lorsque vous créez une classe, c'est que ces variables ont à se donner certaines valeurs par défaut, si vous ne spécifiez rien, vous obtenez la valeur par défaut valeurs construites, quelle que soit ceux sont. Vous pouvez affecter des valeurs plus tard, mais que le premier défaut obtiendrez toujours placé en premier. Si vous utilisez l'initialiseur de liste, vous obtenez de spécifier ce qui est placé dans la mémoire la première fois autour.Merci à vous, qui prend tout son sens.
Heureux qui a aidé, j'ai édité que dans ma réponse que je pense que c'est vraiment important de comprendre ce qui se passe à un niveau plus profond.
OriginalL'auteur shuttle87
Modifier le constructeur de la façon suivante
Le problème est que si vous n'allez pas appeler explicitement le constructeur avec paramètres pour la classe
Point
puis le compilateur essaie d'appeler le constructeur par défaut de la classe pour créer membre des donnéescenter_pt
de la classe Cercle avant que vous pouvez attribuer le point à l'intérieur du corps du constructeur de la classeCircle
. Mais vous ne définissez pas le constructeur par défaut de la classePoint
et le compilateur a émis une erreur.L'autre approche consiste en effet à définir le constructeur par défaut pour la classe
Point
que, par exemple, initilaizes un point avec des zéros.Prendre en compte que par la conception de la classe
Point
vous ne pouvez pas modifier les données membrescoord_x
etcoord_y
d'un objet créé.Peut-être vous devriez refonte de la classe.OriginalL'auteur Vlad from Moscow
C'est parce que vous n'êtes pas de l'initialisation du membre dans la liste d'initialisation, mais plutôt en lui attribuant dans le corps. Par conséquent, il est d'abord la construction à l'aide de la valeur par défaut ctor, et donc votre compilateur de la plainte.
Envisager de changer les choses:
OriginalL'auteur Ami Tavory
Changement
à
De sorte qu'il utilise le constructeur que vous avez défini pour le point. Aussi mieux pour le rayon ainsi
OriginalL'auteur Ed Heal
En essayant de construire le Cercle, vous avez essayé de construire un Point à l'aide d'un constructeur par défaut:
...et puis attribué une valeur:
Étant donné que le constructeur par défaut n'existait pas, vous avez obtenu l'erreur de compilation.
Deux solutions sont:
1) Construire un Point à l'aide d'un membre de l'initialisation de la liste:
2) Définir un constructeur par défaut pour le Point:
Je suis avant tout de répondre à cette question à la place accent sur l'option 2, je crois que ce accent manquait dans les réponses ci-dessus. Parfois, c'est plus pratique à défaut de construire un objet dans un givens classe de la liste des paramètres et de lui assigner une valeur à un stade ultérieur. Il est rencontré un peu dans la programmation GUI en utilisant le framework Qt.
OriginalL'auteur Dean P