2013-09-01 5 views
0
#include <iostream> 
#include <string> 
string &parse(string str,int from){ 
    string *data=new string[6]; 
    .... 
    .... 
    return *data; 
} 


int main(){ 
string data[6]; 
data=parse(str,18); //ERR: std::string must be a modifiable lvalue 
} 

J'ai l'erreur ci-dessus, je pense à créer operator =, est-ce correct? Si oui, j'ai essayé ceErreur lors de la tentative de placer un tableau de chaînes dans un tableau de chaînes

string operator=(const string& other){} //ERR: operator= must be a member function

mais je reçois une autre erreur. Merci pour votre aide.

+0

data est un tableau de chaînes, l'analyse renvoie une référence à une chaîne. Qu'attendez-vous de cette mission?!? – Borgleader

+0

devrais-je définir la fonction en tant que chaîne * parse (..) puis retourner * données? –

+0

Toujours ne fonctionnerait pas. – Borgleader

Répondre

2

parse() renvoie une référence à un std::string, donc quand vous déréférencer le tableau local de chaînes, vous êtes renvoyer une référence à la première chaîne du tableau. Dans main(), vous affectez cette référence à un tableau de chaînes, ce qui n'a aucun sens.
La meilleure option pour obtenir ce que vous essayez de faire est d'utiliser std::vector:

std::vector<std::string> parse() 
{ 
    std::vector<std::string> v(6); 

    ... 

    return v; 
} 

int main() 
{ 
    std::vector<std::string> data; 

    data = parse(); 
} 

Le vecteur est retourné par valeur, mais il n'y a pas de problème de performance, car le vecteur peut être eassilly déplacé au lieu de copier.

Si vous ne pouvez pas utiliser std::vector (parce que vous essayez d'apprendre et de comprendre des tableaux dynamiques, par exemple), vous pouvez retourner un pointeur vers le tableau dynamique que vous adjugées aux beggining de parse():

std::string* parse() 
{ 
    std::string* strs = new std::string[6]; 

    ... 

    return strs; 
} 

int main() 
{ 
    std::string* data; 

    data = parse(); 

    ... 

    delete[] data; //Don't forget to release the array memory! 
} 
+0

Cette dernière instruction est fausse, car si vous regardez son code, le tableau en analyse est alloué sur le tas. – Borgleader

+0

@Borgleader merci, je n'ai pas vu la déclaration 'new', je pensais à un tableau statique local. Fixé. – Manu343726

+0

Notez que cela ne copie aucun tableau, il copie seulement un pointeur. – john

4

Votre code a vraiment besoin de refactoring, ne pas les tableaux d'utilisation de chaînes - utilisation vecteur s de chaînes:

std::vector<std::string> parse(string str,int from){ 
    std::vector<std::string> data(6); 
    .... 
    .... 
    return data; 
} 

int main(){ 
    std::vector<std::string> data=parse(str,18); 
} 
1

Si vous voulez vraiment le faire sans vecteurs (vous devriez utiliser des vecteurs, mais de toute façon ..) vous devez obtenir vos types droit:

chaîne *: pointeur sur la chaîne (peut être plusieurs chaînes l'un à côté de l'autre), chaîne &: référence à une seule chaîne. Cependant, je vous suggère de lire sur les pointeurs, les références et ce qui se passe lorsque vous appliquez le * -operator. string * fait pas signifie simplement "tableau de chaînes"

Questions connexes