печать строки-члена структуры в потоке cout

0

что лучший способ распечатать строку-строку структуры, хранящуюся в векторе, я попытался получить строку с помощью const_iterator вектора, но результатом являются только начальные значения, сделанные конструктором класса (пустые строки). заранее спасибо

#include <vector>
#include <string>
#include <iostream>
#include <cstdio>

class X
{

public:
    std::string s1 , s2, s3 ;
    X()
    {
        s1 = " " ;
        s2 = " " ;
        s3 = " " ;
    }

};

void getstring(const char* msg , std::string storage)
{
    std::cout << msg ;
    std::getline(std::cin,storage) ;

}

int main()
{
    std::vector<X>data ;
    std::vector<X>::const_iterator it ;

    int register_no ;
    std::cout << "Enter Registers No. : " ;
    std::cin>>register_no;

    X temp ;

    for (int i = 0 ; i < register_no ; i++)
    {

        getchar();

        getstring("Enter s1 : " , temp.s1);
        getstring("Enter s2 : " , temp.s2) ;
        getstring("Enter s3 : " , temp.s3) ;

        data.push_back(temp) ;
    }

    for (it=data.begin() ; it != data.end(); ++it)
    {
        //following code is not effective:
        std::cout << (*it).s1 << std::endl ;
        std::cout << (*it).s2 << std::endl ;
        std::cout << (*it).s3 << std::endl ;
    }

}
  • 0
    Вам нужно передать второй параметр по ссылке в getstring , то есть std::string &storage .
Теги:
vector

2 ответа

0
Лучший ответ

Попробуйте эту модификацию:

void getstring(const char* msg , std::string& storage)
{
    std::cout << msg ;
    std::getline(std::cin,storage) ;

}

Примечание: для параметра string используется ссылка для копирования в элемент. Если параметры не объявлены как ссылки, то параметр передается "по значению", что означает, что параметр копируется во внутреннюю часть функции, а когда функция возвращает параметр, стирается.

0

Вы передаете строку по значению для этого значения чтения - это хранилище в локальной переменной string метода getstring.

void getstring (const char * msg, std :: string & storage)

Рекомендуем также изменить (*it).s1 для it->s1.

  • 0
    Какова причина вашего предпочтения it->s1 over (*it).s1 ?
  • 0
    более чистый синтаксис, избегайте скобок (в примере это действительно просто и, вероятно, неважно, но при объединении двух или трех вложенных итераторов доступ к скобкам начинает расти до такой степени, что трудно определить, к какому выражению относятся

Ещё вопросы

Сообщество Overcoder
Наверх
Меню