2016-02-13 26 views
6

dizisinin ilk dizesini alırken, C++ 14 kullanıyorum ve dizinin her dizisini basan her döngü için bir oluşturmaya çalışıyorum. Her döngü için yalnızca C++

user.cpp:12:34: error: invalid initialization of reference of type ‘std::string& {aka std::basic_string&}’ from expression of type ‘char’

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

Bu foreach döngüsü auto std :: string değiştirmek

, bu str favs dizideki ilk dizenin bireysel karakterleri olur ama çalışır: hatası alıyorum. Kodum aşağıdaki gibidir:

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 Eğer aralık tabanlı kullanmak istiyorsanız

#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"; 
    } 
} 
+0

Ayrıca, user.favs boyutu dizinin ilk dizgisinin boyutudur, dizideki öğe sayısı değil – a0935

cevap

5

zaman sizi KQUEUE u->favs, bir std::string& alırsınız ve aralık tabanlı, daha sonra bu string tek bir karakter üzerinde tek bir karakter üzerinde yinelenen başlar. Bu nedenle, auto ilk karakter dizisindeki tek tek karakterleri gördüğünüzde ve bu karakteri string& bağlamaya çalıştığınızda bir derleme hatası alırsınız.

İşaretçi türüyle çalışacak bir dizi elde edemezsiniz, çünkü işaretçinizin kaç nesneye işaret ettiğini bilmenin bir yolu yoktur. Statik boyutlu bir dizi olarak favs bildirmek için kodunuzda aşağıdaki değişiklikleri yaparsanız, kodunuz çalışır. Eğer bir dinamik boyutlu dizi gerekiyorsa

sonra yerine std::vector<std::string> kullanın

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

için sınıf tanımını değiştirin

, ve döngü çalışmaya devam eder.

+0

Temel bir dizi yerine vektörü hızlı bir şekilde denemek istiyorsanız, @ Praetorian'un yanıtı da std :: string favs [5]; 'std :: vector favs '' – MtRoad

+0

'' cevabından doğrudan takas ederseniz, vektörün başlatıcı listesi oldukça doğrudur, fakat özellikle C-dizilerini destekleyen bir yanıt almaktan çekiniyorum. diğer modern C++ yapıları ile birlikte. – ildjarn

+0

@ildjarn Fakat 'std :: array' düz C dizisine kıyasla çok daha fazla yazıyor :) – Praetorian

1

loop, 2 yol var:

1) std::string favs[n];

aralık tabanlı döngü sabit boyut

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

aralık tabanlı döngü uygulanan nesnelere karşı çalışır diziler karşı çalışır/son başlar ve STL kaplar yapmak.

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 sınıfınızın ... ana dizi olacak ve burada yapacağını nasıl,/ucunu başlamak fikri denemek istiyorsanız:

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;