Passage de paramètre par référence en c++
Je vais avoir un problème avec l'option paramètre de fonction en C++
Ce que j'essaie de faire est d'écrire de la fonction avec le paramètre optionnel qui est passé par référence, afin que je puisse l'utiliser de deux manières (1) et (2), mais sur (2) je ne m'en soucie pas vraiment quelle est la valeur de mFoobar
.
J'ai essayé ce code:
void foo(double &bar, double &foobar = NULL)
{
bar = 100;
foobar = 150;
}
int main()
{
double mBar(0),mFoobar(0);
foo(mBar,mFoobar); //(1)
cout << mBar << mFoobar;
mBar = 0;
mFoobar = 0;
foo(mBar); //(2)
cout << mBar << mFoobar;
return 0;
}
mais il bloque au
void foo(double &bar, double &foobar = NULL)
avec le message :
error: default argument for 'double& foobar' has type 'int'
Est-il possible de le résoudre sans surcharge de fonctions?
- Bien sûr que non, même si vous pouvez passer une référence NULLE, que pensez-vous arriverait-il au sein de la fonction lorsque vous avez essayé de lui affecter une valeur ?
- Erreur de Compilation n'est pas un accident.
- Votre code n'est pas "s'écraser", il obtient une erreur de compilation. Une panne peut se produire après que vous avez entièrement construit votre programme et de tenter de l'exécuter.
- double possible de la valeur par Défaut à un paramètre alors que le passage par référence en C++
- Toute personne dans cette situation doit vraiment avaler leur fierté et préférences esthétiques et utiliser un
*const
pointeur. C'est une indirection, tout comme une référence, mais avec la possibilité de valeur null/testabilité. Pourquoi compliquer les choses avec des variables nominales, la dilatation de Boost, etc - quand la langue fournit une des fonctions de base qui correspond à la facture précisément pour autant que je peux dire?
Vous devez vous connecter pour publier un commentaire.
L'argument par défaut d'un (mutable) de référence doit être une l-value. Le mieux que je peux penser, sans surcharge, est
std::string("hello") = world
, et certains lvalues ne peut être affectée, par exemple C-les tableaux et les objets sans un opérateur d'affectation. (Aussi, const lvalues ne peut être affectée, bien sûr, mais qui semble être bien compris.)_dummy_foobar
dans uninternal
espace de noms et ne facultatif opérations avecfoobar
dans la fonctionfoo
si&foobar!=&internal::_dummy_foobar
pour éviter_dummy_foobar
d'être accessible.Ne pas utiliser des références pour les paramètres facultatifs. Il n'y a pas de notion de référence NULL: une référence est toujours un alias à un objet particulier.
Peut-être regarder
boost::optional
oustd::expérimental::optional
.boost::optional
est même spécialisé pour les types référence!Pourquoi ne pouvez-vous pas utiliser la fonction de surcharge? Sûrement, c'est la meilleure solution à votre problème?
foo
a plus de lignes de code et l'option réf variablefoobar
fait, seul des 4 lignes de code dans la première surchargevoid foo(double &bar)
? puis cette idée, sera certainement une duplication de code, non?Une autre façon de le faire est d'utiliser des pointeurs au lieu de références. Ceci fournit la sémantique que vous voulez sans surcharge. (Personnellement, je serais probablement aller avec la surcharge.)
Voici un autre fou de façon à ne pas entraîner des fuites de mémoire, que vous ne devez jamais utiliser dans la vie réelle, mais semble être conformes à la norme au premier coup d'œil et se compile avec Visual C++ 2008 & g++ 3.4.4 sous Cygwin:
À rappeler: NE faites PAS CELA! IL YA DE MEILLEURES OPTIONS! LA SURCHARGE PEUT ÊTRE VOTRE AMI! Mais oui, vous pouvez le faire si vous êtes stupide et le plus prudent. 🙂
Il est beaucoup plus facile d'utiliser un pointeur de type et la valeur NULL de la configuration par défaut d'option et/ou de la valeur pour un paramètre de référence.
const
références. À moins que la fonction de la bibliothèque prend uneconst
de référence, vous devez supposer qu'il va changer votre variable. Les références doivent être préférés aux pointeurs dans la plupart des cas.const
de référence... ou (B) supposons qu'un pointeur brut est non propriétaire, puisque nous avons la STL_ptr
classes pour signifier à la propriété et à utiliser les sémantiquement.Parler en termes de paradigme Orienté Objet: Si la classe a et "par Défaut", ce Défaut doit déclarée en conséquence, et puis peut être utilisé comme un "Paramètre par Défaut"
Ex:
Sur votre Méthode ...
Édité: Cette solution est tout à fait approprié puisque dans ce cas c'est un "par défaut" de la Pagination et une seule "référence" de la valeur. Vous aurez également le pouvoir de changer les valeurs par défaut telles que la navigation/préférences d'affichage et etc.
Edit2: l'orthographe et la fixation...
C'est comment j'ai résolu cette question:
Ma fonction d'origine n'ont pas renvoyé l'erreur de chaîne de caractères:
bool Maclasse::validateXML(const QString& fileName, const QUri& schemaUri);
Je voulais ajouter les résultats de la validation dans une chaîne d'erreur donc j'ai mis en place:
bool Maclasse::validateXML(const QString& fileName,
const QUri& schemaUri,
QString& errorString = *(std::make_unique().get()));
De cette façon, vous pouvez faire référence à la errorString dans validateXML sans vérifier s'il est valide, et pas de fuites de mémoire.
Vous pouvez le faire complètement folle:
P. S. - je sais que c'est pas agréable, mais son chemin. Assurez-vous également de ne pas laisser les fuites de mémoire! :))