只是一个简短的问题,我将继续前进。当我尝试使用字符串类读取字符串时,为什么会出现错误?我收到的错误是:“no operator”>>“匹配这些操作数/操作数类型是std :: istream>> std :: string *”
我开始使用该类而不是cStrings。不幸的是,当我尝试使用cin读取字符串时,我不断收到错误。例如:
void ProcessEditMenuItems( int menu_choice, std::string fname[], std::string lname[],
std::string phone[], std::string bday[] /*char fname[][NAME_LENGTH], char lname[][NAME_LENGTH], char phone[][NAME_LENGTH],
char bday[][NAME_LENGTH]*/ )
{
switch ( menu_choice )
{
case 1:
std::cout << "\nEnter new first name: ";
std::cin >> fname;
break;
case 2:
std::cout << "\nEnter new last name: ";
std::cin >> lname;
break;
case 3:
std::cout << "\nEnter new phone number: ";
std::cin >> phone;
break;
case 4:
std::cout << "\nEnter new birthday: ";
std::cin >> bday;
break;
}
}
上面的代码适用于普通的cStrings,但是当我将函数声明和定义更改为字符串类时,它不起作用。
答案 0 :(得分:3)
您的论据fname
,lname
,phone
和bday
被声明为std::string arg[]
,参数转换为std::string* arg
。也就是说,它们是std::string
的指针。如果要传递std::string arg[]
的数组,则只能使用std::string
声明参数。
如果你为每个参数传递一个std::string
,那么你真正想要的是一个引用类型。例如,fname
应为std::string& fname
。该引用允许将std::string
传递给函数而不进行复制,因此当您使用>>
读取它时,您将修改原始对象。
答案 1 :(得分:2)
您实际上是在传递字符串数组,但是应该将非const引用传递给字符串。
将您的函数原型更改为:
void ProcessEditMenuItems(
int menu_choice,
std::string& fname,
std::string& lname,
std::string& phone,
std::string& bday
)
应该没事。
从C字符串转换为std::strings
时,您可以使用以下转换表:
Old parameter | New parameter | Description
const char* | const std::string& | Non-modifiable parameter
char* | std::string& | Modifiable string
最好的事情是,在使用char*
进行更改时,您不需要关心字符串大小。如果需要增加大小,也不必处理删除/重新分配。
答案 2 :(得分:1)
fname
是std::string
的数组。使用数组是否是您之前使用C字符串的宿醉 - char fname[]
?如果是这样,您可以更改为传递std::string&
而不是
void ProcessEditMenuItems(int menu_choice,
std::string& fname,
std::string& lname,
std::string& phone,
std::string& bday)
答案 3 :(得分:0)
此错误类似于int arr[2]; arr = 1;
fname是一个包含字符串对象的数组。 “std :: cin&gt;&gt;”表示从标准输入中提取字符串。我们只能将字符串对象分配给fname [0],fname [1] ....
请尝试std::cin >> fname[0]
;