对于每个循环,只需要第一个数组C ++字符串

时间:2016-02-13 01:05:42

标签: c++ arrays string c++14

我正在使用C ++ 14并尝试为每个循环创建一个打印出该数组的每个字符串的循环。我收到错误:

  

user.cpp:12:34:错误:类型'std :: string&的引用的初始化无效{aka std :: basic_string&}'来自'char'类型的表达式

     

for(std :: string& str:*(u-> favs)){

当我在foreach循环中将std :: string更改为auto时,它可以工作,但str成为favs数组中第一个字符串的单个字符。 我的代码如下:

user.h

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";
    }
}

2 个答案:

答案 0 :(得分:5)

当你取消引用u->favs时,你得到一个std::string&,并且基于范围,然后开始一次迭代string一个字符。这就是为什么当您auto看到第一个字符串中的单个字符时,以及当您尝试将该字符绑定到string&时,会出现编译错误。

您无法获得基于指针类型的范围,因为它无法知道指针指向的对象数量。如果对代码进行以下更改以将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>,你的循环仍然有效。

答案 1 :(得分:1)

如果你想使用基于范围的循环,有两种方法:

1)std::string favs[n];

基于范围的循环适用于具有常量大小的数组

2)std::vector<std::string> favs

基于范围的循环适用于已实现begin / end的对象,而STL容器则执行此操作。

class User{
    public:
        User() : favs {"Hello", "how", "are", "you", "?"} { }
        std::vector<std::string> favs;
};

for(std::string& str : u->favs)
    std::cout << str << std::endl;

3)如果favs将是您班级的主要阵列......并且您想尝试开始/结束的想法,那么您将如何做到这一点:

class User
{
public:
    std::string *favs;
    int favs_size;
    User()
    {
        favs_size = 5;
        favs = new string[favs_size];
    }
    ~User() { delete[] favs; } 

public:
    std::string* begin() { return favs; }
    std::string* end() { return favs+favs_size ; }
};

User u;
for(std::string &str : u)
    std::cout << str << std::endl;