"cet argument est de type const mais la fonction n'est pas marqué const
Bon alors je suis un peu un noob en C++ et dans mon deuxième exercice, je suis tenu de rendre les classes privé et public et des arguments, etc, etc. Fondamentalement, le mutateur fonctions ne fonctionnent pas car apparemment ils ne sont pas de type const?
C'est le fichier d'en-tête avec la classe:
class Customer {
private:
string PhoneNumber_;
string Name_;
string Address_;
public:
string get_PhoneNumber() const {return PhoneNumber_;} //Accessor
const void set_PhoneNumber(unsigned x) {PhoneNumber_ = x;} //Mutator
string get_Name() const {return Name_;}
const void set_Name(unsigned x) {Name_ = x;}
string get_Address() const {return Address_;}
const void set_Address(unsigned x) {Address_ = x;}
};
//declare the CreateCustomer function prototype with default values
Customer* CreateCustomer(const string& id = BLANK, const string& name = BLANK, const string& address = BLANK);
Customer* CreateCustomer(const string& id, const string& name, const string& address) {
Customer* temp = new Customer();
temp->get_PhoneNumber() = id; //Due to the Accessors and Mutators PhoneNumber, Name and Address are now functions
temp->get_Name() = name;
temp->get_Address() = address;
return temp;
}
Et c'est l'erreur que je reçois dans le main.cpp fichier:
cout << "\n\nDear ";
cout << Charge[0].Holder.set_Name() << " (" << Charge[0].Holder.set_PhoneNumber() << ")"; // DisplayCustomer(customer) ;
cout << ",\n" << Charge[0].Holder.set_Address() << "\n\n"
Fondamentalement, le message d'erreur exact est:
Fonction membre 'set_Name" pas viable: "cet argument est de type 'const
Client", mais la fonction n'est pas de type const
Il arrive avec set_PhoneNumber et set_Address. Toute aide serait grandement appréciée! Merci!
Mise à JOUR: je l'ai eu à travailler. Merci à tous pour m'avoir aidé!
const void
!?CreateCustomer()
devrait appeler set_PhoneNumber(id)
si vous voulez set numéro de téléphone. Et son argument dirait qu'il a besoin d'être un string
plutôt qu'un unsigned
.Vous message d'erreur est auto-explicatif. Vous ne pouvez pas appeler non-const fonctions sur les objets const. Cependant, je ne vois pas quelle est la Charge ou du Titulaire ou de où et comment vous déclarez ces entités.
Qu'est-ce que
Charge
et Holder
?Comment ne pas getters et setters?
OriginalL'auteur Liam George | 2015-09-11
Vous devez vous connecter pour publier un commentaire.
Si vous souhaitez définir une valeur, utilisez la méthode set. obtenez les Méthodes sont seulement à obtenir des variables, et non de l'intérieur variables d'une classe (Si ils sont définis de la manière que vous avez fait).
L'utilisation correcte est:
Aussi, vous devez modifier l'interface de vos méthodes:
Puisque vous souhaitez définir des chaînes de caractères et non des nombres.
À l'aide de
const string&
comme arguments de la fonction est meilleure que la chaîne de ne pas copier la chaîne lors du passage en argument. Depuis, c'est un const référence, vous n'avez pas à craindre la fonction peut manipuler l'entrée.OriginalL'auteur Gombat
Vous devez utiliser
std::
dans la déclaration de classe. Voir Pourquoi le “using namespace std;” considéré comme une mauvaise pratique? sur la question de savoir pourquoi.Votre
set_
méthodes prennentunsigned
arguments. Vous ne pouvez pas affecter un entier non signé pour une chaîne commePhoneNumber_ = x;
. Les arguments doivent être des chaînes de caractères.Vous aurez besoin de changer vos membres comme
Lorsque vous écrivez
temp->get_PhoneNumber() = id;
votre intention est clairement de ensemble la valeur dePhoneNumber_
, alors pourquoi utilisez-vous le get_ méthode? Juste utiliser le bon set_ méthode et écriretemp->set_PhoneNumber(id);
.Généralement éviter les pointeurs en C++. Si vous êtes vraiment dans le besoin d'un pointeur utiliser un pointeur intelligent comme
std::unique_ptr
oustd::shared_ptr
(si et seulement si vous êtes obligé d'utiliser un simple pointeur: en utilisez un).Un 'vide' valeur par défaut pour un
std::string
est une chaîne vide commestd::string const & id = std::string{}
Semble plus clair pour moi.Pour créer un objet de type
Customer
avec vide/vide membre de chaînes que vous n'avez pas besoin de faire plus queCustomer customer_object;
car il est implicitement déclaré constructeur par défaut qui utilise lestd::string
constructeur par défaut qui entraîne un vide strign de toute façon.Généralement un constructeur est utilisé pour créer un objet en fonction de certains arguments des valeurs.
Vous pouvez facilement écrire une autre qui prend toutes les valeurs requises et peut être utilisé comme un défaut constructo de toute façon en ajoutant quelque chose le long des lignes de
à votre classe. Voir un autre C++ de la Classe Liste d'Initialisation exemple.
Voir un autre C++ de la Classe Liste d'Initialisation exemple.
OriginalL'auteur Pixelchemist
Ehm. Je pense que vous devriez utiliser
get
etset
en sens inverse...Dans
CreateCustomer
vous devez utiliserset
fonctions et lors de l'impressionCustomer
de flux, vous devez utiliser lesget
fonctions.Et
set
fonctions doivent reçoitstring
, pasunsigned
.Et ainsi, il sera préférable d'utiliser
constructor
, au lieu deset
des fonctions et ensuite, ce sera seulementget
fonctions.OriginalL'auteur ForEveR
Vous avez déclaré
PhoneNumber_
,Name_
etAddress_
commestring
.Mais dans le setter, vous êtes de passage à
unsigned (int)
Aussi, vous avez inversé l'utilisation des accesseurs et mutateurs!
Aussi, les types de retour des setters peut être juste
void
et pasconst void
.OriginalL'auteur CinCout