尝试将字符串数组放入字符串数组时出错

时间:2013-09-01 20:39:15

标签: c++

#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

但我得到了另一个错误。 谢谢你的帮助。

3 个答案:

答案 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 * 只是意味着“字符串数组”