Comment déclarer un tableau avec une classe personnalisée?
Je suis en train de déclarer un tableau avec une classe personnalisée. Quand j'ai ajouté un constructeur à la classe, mon compilateur se plaint qu'il n'y a "Pas de correspondance constructeur pour l'initialisation du nom[3]".
Voici mon programme:
#include <iostream>
using namespace std;
class name {
public:
string first;
string last;
name(string a, string b){
first = a;
last = b;
}
};
int main (int argc, const char * argv[])
{
const int howManyNames = 3;
name someName[howManyNames];
return 0;
}
Que puis-je faire pour faire cette course, et ce que je fais mal?
source d'informationauteur Moshe
Vous devez vous connecter pour publier un commentaire.
Vous devez fournir un constructeur par défaut. Pendant que vous y êtes, fixer votre autre constructeur, trop:
Sinon, vous devez fournir les initialiseurs:
Ce dernier est théoriquement préférable, car il n'y a pas de raison que votre classe devrait ont une notion de l'état "par défaut". Dans ce cas, il vous suffit de ont de fournir un initialiseur pour chaque élément du tableau.
Objets en C++ ne peut jamais être dans un mauvais état; si vous pensez à ce sujet, tout devrait devenir très clair.
Une alternative est d'utiliser un dynamique conteneur, même si c'est différent de ce que vous avez demandé:
Par défaut-initialiser un tableau de
T
s,T
doivent être par défaut constructible. Normalement le compilateur vous donne un constructeur par défaut pour gratuit. Cependant, puisque vous avez déclaré un constructeur vous-même, le compilateur ne génère pas de constructeur par défaut.Vos options:
initialiser tous les éléments de la matrice lors de la déclaration (vous pouvez le faire parce que
name
est un agrégat);utiliser un
std::vector
au lieu de cela, et ne fait qu'ajouter de l'élément lorsque vous avez construit.vous avez juste besoin d'ajouter un constructeur par défaut de votre classe à ressembler à ceci:
Votre classe:
A un explicite constructeur qui nécessite deux paramètres de la chaîne. Classes avec aucun constructeur écrit explicitement obtenir constructeurs par défaut à ne pas prendre de paramètres. L'ajout de l'explicite arrêté le compilateur de générer que le constructeur par défaut pour vous.
Donc, si vous souhaitez faire un tableau d'objets non initialisées, ajouter un constructeur par défaut de votre classe, de sorte que le compilateur sait comment créer sans fournir ces deux paramètres de la chaîne - voir le commentaire de la ligne ci-dessus.
Vous avez besoin d'un constructeur sans paramètre pour être en mesure de créer une instance de votre classe. Votre constructeur requiert deux paramètres de la chaîne.
Normalement C++ implique d'avoir un tel constructeur (=par défaut constructeur sans paramètre) si il y a pas d'autres constructeur déclaré. En déclarant votre premier constructeur à deux paramètres vous remplacer ce comportement par défaut et maintenant, vous devez déclarer ce constructeur explicitement.
Voici le code de travail:
(BTW, vous devez inclure à rendre le code compilable.)
Une alternative est d'initialiser votre cas explicitement sur la déclaration
Afin de créer un tableau d'objets, les objets ont besoin d'un constructeur qui ne prend pas toutes les paramétrée (qui crée un formulaire par défaut de l'objet, par exemple. avec deux cordes à vide). C'est quoi le message d'erreur signifie. Le compilateur génère automatiquement un constructeur qui crée un objet vide sauf il y a d'autres constructeurs.
Si elle fait sens pour les éléments du tableau d'être créé vide (dans ce cas, les membres acquièrent leurs valeurs par défaut, dans ce cas, les cordes à vide), vous devez:
-Écrire un constructeur vide:
-Ou, si vous n'en avez pas besoin, retirez le constructeur existant.
Si un "vide" de la version de votre classe n'a pas de sens, il n'y a pas de bonne solution pour fournir de l'initialisation des paramètres de tous les éléments de la matrice au moment de la compilation. Vous pouvez:
init()
fonction qui ne le réel initialisationvector
et lors de l'initialisation de créer les objets et les insérer dans levector
soit à l'aide devector::insert
ou une boucle, et de la confiance que ne pas le faire au moment de la compilation n'a pas d'importance..
`