2013-09-01 4 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 
} 

У меня ошибка выше, я думаю создать оператор =, это правильно? Если да, то я попробовал этотОшибка при попытке разместить строковый массив в строковый массив

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

, но я получаю другую ошибку. Спасибо за помощь.

+0

данные представляют собой строковый массив, parse возвращает ссылку на строку. Что вы ожидаете от этого задания?!? – Borgleader

+0

следует определить функцию как строку * parse (..), а затем вернуть * данные? –

+0

Все равно не получится. – Borgleader

ответ

2

parse() возвращает ссылку на std::string, поэтому, когда вы разыменовать локальный массив строк, вы возвращая ссылку на первую строку массива.
В main() вы назначаете эту ссылку массиву строк, который вообще не имеет смысла.
Самый лучший вариант, чтобы добиться того, что вы пытаетесь сделать, это использовать std::vector:

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

    ... 

    return v; 
} 

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

    data = parse(); 
} 

Вектор возвращается значение, но это не проблема производительности, так как вектор может быть eassilly перемещен вместо копирования.

Если вы не можете использовать std::vector (потому что вы пытаетесь узнать и понять динамические массивы, например), вы можете вернуть указатель на динамический массив, который вы выделяемый на само начале из 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

Это последнее утверждение неверно, потому что если вы посмотрите на его код, массив в синтаксисе выделяется в куче. – Borgleader

+0

@Borgleader спасибо, я не видел инструкцию 'new', я думал о локальном статическом массиве. Исправлена. – Manu343726

+0

Обратите внимание, что это не копирует какой-либо массив, он копирует только указатель. – john

4

Ваш код действительно нуждается рефакторинга, не использовать массивы строк - использование вектор-х строк:

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

если вы действительно хотите сделать это без векторов (вы должны использовать векторы, но в любом случае ..), вы должны правильно использовать свои типы:

string *: указатель на строку (может быть несколько строк рядом друг с другом), строка &: ссылка на одну строку.

#include <string> 
using namespace std; 

// return type is "pointer to string", not "reference to string" 
string* parse(string str,int from){ 
    string *data=new string[6]; 
    return data; // do not apply the *-operator here. 
} 

int main(){ 
string* data; // don't mention the size here. (probably the error you got.) 
data=parse("hmm..",18); // assign the result (pointer) to data 
delete[] data; // don't leak memory 
} 

Однако я предлагаю вам ознакомиться с указателями, ссылками и тем, что происходит, когда вы применяете * -оператор. строка * делает не просто означает «массив строк» ​​

Смежные вопросы