Bonjour,
Voici le contexte (je travail avec Qt, mais c'est une question plus général au C++):
J'ai une classe qui possède en attribut un tableau (en l'occurance, un QJsonArray, nommé mJSONData) et une méthode utilisée pour le remplir (setJSONData(à définir)).
De l'extérieur, j'ai un QVariant qui me fournit les données, dont voici le prototype de la fonction que j'utilise:
QJsonArray QVariant::toJsonArray() const
Actuellement, voici le code que j'ai écris:
1 2 3 4 5 6 7 8 9
|
...
QJsonArray jsonArray = variant.toJsonArray();
setJSONData( &jsonArray );
...
void MaClasse::setJSONData( QJSonArray *jsonData ){
mJSONData = jsonData;
} |
Problème: là je compte 2 recopies, en ligne 3 et 9.
Déjà, première question: est-ce que les compilateurs (en l'occurence gcc) sont-ils suffisament intélligent pour économiser la recopie inutile tout seuls (sachant que jsonArray n'est plus du tout utilisé après)?
Peut-être que cette syntaxe est plus évidente pour lui?:
1 2 3 4 5 6 7 8
|
...
setJSONData( variant.toJsonArray() );
...
void MaClasse::setJSONData( QJSonArray jsonData ){
mJSONData = jsonData;
} |
Mais en principe, je compte toujours deux recopie, lors de l'appel de la fonction, puis à l'intérieur.
Et sinon, quelle syntaxe me permettrait d'éliminer ce travail inutile?
Au début, j'avais essayé ça:
1 2
|
setJSONData( &(variant.toJsonArray()) ); |
mais le compilateur me sortait un beau:
taking adress of temporary [-fpermissive]
J'ai essayé plusieurs autres synthaxes, mais aucune ne passait.
J'ai même tenter un truc que je n'avais encore jamais essayer:
1 2 3 4 5 6 7
|
...
setJSONData( variant.toJsonArray() );
...
void MaClasse::setJSONData( QJSonArray this->mJSONData ){
} |
En espérant que lors de l'appel de la fonction, il me fasse la recopie directement dans mon attribut 
Mais évidament, le compilateur m'a revoyé dans ma chambre.
Une méthode serait d'envoyer une référence du variant, et de faire tout le travail à l'intérieur de la méthode, mais je tiens à exposer une méthode qui ne prend qu'un QJsonArray en argument.
Vous voyer une manière de faire?
Merci.
Partager