#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
}
我得到了上面的错误,我正在考虑创建operator =,这是正确的吗? 如果是这样,我试过这个
string operator=(const string& other){} //ERR: operator= must be a member function
但我得到了另一个错误。 谢谢你的帮助。
答案 0 :(得分:4)
您的代码确实需要重构,不要使用字符串数组 - 使用字符串的vector-s:
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 :(得分: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();
}
向量按值返回,但没有性能问题,因为向量可以移动而不是复制。
如果你不能使用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!
}
答案 2 :(得分:1)
如果你真的想在没有矢量的情况下这样做(你应该使用矢量,但无论如何..)你必须让你的类型正确:
string *:指向string的指针(可以是彼此相邻的几个字符串),string&amp;:对单个字符串的引用。
#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
}
但是我建议你阅读指针,参考资料以及应用* -operator时会发生什么。 string * 不只是意味着“字符串数组”