我正在使用C ++ 14并尝试为每个循环创建一个,以打印出数组的每个字符串。我得到错误:
user.cpp:12:34:错误:类型'char'的表达式对类型'std :: string&{aka std :: basic_string&}'的引用的初始化无效
for(std :: string&str:*(u->收藏夹)){
当我在foreach循环中将std :: string更改为auto时,它可以工作,但是str成为favs数组中第一个字符串的单个字符。我的代码如下:
用户名
class User{
private:
public:
User(){
favs = new std::string[5]{std::string("Hello"), std::string("how"), std::string("are"), std::string("you"), std::string("?")};
}
~User(){
delete[] favs;
}
std::string lName;
std::string fName;
int age;
std::string *favs;
};
user.cpp
#include <iostream>
#include "user.h"
void create(User *u){
std::cout << "Please enter first name: ";
std::cin >> u->fName;
std::cout << "Please enter last name: ";
std::cin >> u->lName;
std::cout << "Please enter age: ";
std::cin >> u->age;
for(std::string &str : *(u->favs)){
std::cout << str << std::endl;
}
std::cout << "\n";
}
main.cpp
#include <iostream>
#include <string>
#include "user.h"
int main(){
std::string command;
User user;
std::cout << "bp1: " << user.favs->size() << std::endl;
while(true){
std::cout << "Please enter a command (Create, Update, View, Favorites, or Quit): ";
std::cin >> command;
if(command == "Create"){
create(&user);
} else if(command == "Update"){
update(&user);
} else if(command == "View"){
view(&user);
} else if(command == "Favorites"){
//favorites(&user);
} else if(command == "Quit"){
break;
} else std::cout << "Please input a valid command.\n";
}
}
取消引用时,u->favs
您会得到一个std::string&
基于的范围,然后开始一次遍历该string
字符。这就是为什么当您auto
从第一个字符串中看到单个字符时,以及当您尝试将该字符绑定到astring&
时会出现编译错误的原因。
您无法获得基于的区域来使用指针类型,因为它无法知道指针指向多少个对象。如果对代码进行以下更改以声明favs
为静态大小的数组,则代码将起作用。
将您的班级定义更改为
using namespace std::string_literals; // allows use of operator""s (user defined literal)
class User
{
public:
User()
: favs{{"Hello"s, "how"s, "are"s, "you"s, "?"s}} // use operator""s
{}
// no need for a destructor definition
std::string lName;
std::string fName;
int age;
std::array<std::string, 5> favs; // statically sized array
};
如果您需要一个动态大小的数组,请std::vector<std::string>
改用它,您的循环仍将起作用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句