QString passe par problème de référence
-
13-11-2019 - |
Question
J'ai du code qui prend en charge à la fois les types C++ natifs et les types Qt.Par exemple il y a string
'sable QString
qui sont "équivalents".
J'ai 2 fonctions, une qui prend string
et celui qui prend QString
's.Le QString
version convertit les paramètres en string
's et appelle ensuite le string
version de la fonction.
Voici un code générique du problème :
int myClass::LoadQString(const QString &tagName, QString &toReturn)
{
string tag = tagName.toStdString();
string ret = toReturn.toStdString();
//string& ret = toReturn.toStdString(); //This gives me an error
return LoadString(tag, ret);
}
int myClass::LoadString(const string& tagName, string& toReturn)
{
toReturn = "hello world!";
...
}
Ainsi, ce code sera compilé et exécuté... cependant, lorsque j'appelle LoadQString()
le deuxième paramètre est vide QString
une fois qu'il revient.Vous pouvez voir dans ma ligne de commentaire où j'ai essayé string& ret = ...
pour que la référence fonctionne.Si j'appelle LoadString()
puis vérifiez la valeur de toReturn
À son retour, ce sera "Hello World!" comme prévu.
J'essaie juste d'obtenir le LoadQString()
pour fonctionner correctement.
Merci pour votre aide!
La solution
Vous devriez convertir de std::string
retour à QString
après std::string
appel de version
int myClass::LoadQString(const QString &tagName, QString &toReturn)
{
string tag = tagName.toStdString();
string ret = toReturn.toStdString();
int retCode = LoadString(tag, ret);
toReturn = QString::fromStdString(ret);
return retCode;
}
Autres conseils
Tu devrais appeler LoadString
, pas LoadXMLAttribute
, puis attribuez ret
à toReturn
après l'avoir appelé, renvoyez le int
que LoadString
revenu.
Tout d'abord, toStdString crée un objet std::string comme temporaire.Donc, naturellement, vous ne pouvez pas en tirer une référence, vous devez stocker le résultat dans une valeur ou prolonger sa durée de vie via une référence const.
Cependant, pour ce que vous faites, en supposant toReturn
est strictement un paramètre de sortie et que LoadString effectue le travail réel :
int myClass::LoadQString(const QString &tagName, QString &toReturn)
{
string tag = tagName.toStdString();
string ret;
int result = LoadXMLAttribute(tag, ret);
toReturn = QString::fromStdString(ret);
return result;
}
Si toReturn
n'est pas strictement un paramètre de sortie mais aussi un paramètre d'entrée (je vous recommande d'éviter cela car c'est une pratique de conception plutôt déroutante) :
int myClass::LoadQString(const QString &tagName, QString &toReturn)
{
string tag = tagName.toStdString();
string ret = toReturn.toStdString();
int result = LoadXMLAttribute(tag, ret);
toReturn = QString::fromStdString(ret);
return result;
}
Assez simple.Convertissez de QString en std :: string, appelez votre fonction qui accepte std :: strings, stockez la valeur de retour et reconvertissez le paramètre de sortie (ret) en un QString attribué à votre paramètre de sortie (toReturn).