问题描述
以下类将string
行作为来自用户的输入。我的目标是将其存储在istringstream iss
中,然后从istringstream iss
中提取各种数据到各种变量中。但是,当我尝试使用iss
初始化string user_input
时,在编译文件时出现此错误:
我认为问题出在iss{user_input};
行中,请解释为什么我会收到此错误。
_input.h
头文件
#pragma once
#include <string>
#include<sstream>
#include "_date.h"
#include "_time.h"
using namespace std;
//deFinition of class input
class _input
{
string user_input;
istringstream iss;
//datamembers to be sent
int esno,eday,emonth,eihours,eimins,eohours,eomins,emo;
char eiap,eoap;
string enotes;
public:
_input();
void get_input();
void process_data();
};
_input.cpp
文件
#include "_input.h"
_input::_input() : user_input { "nothing Entered" },iss{ "" },esno{ 0 },eday{ 0 },emonth{ 0 },eihours{ 0 },eimins{ 0 },eohours{ 0 },eomins{ 0 },emo{ 0 },eiap{ 'n' },eoap{ 'n' },enotes{ "" }
{
}
void _input::get_input() // to store in iss
{
cout << "Enter the entry : Format (Date - In Time - Out Time - Money Owed - Notes)" << endl;
getline(cin,user_input);
iss{user_input}; //THIS IS WHERE I GET THE ERROR
}
void _input::process_data()
{
iss >> eday >> emonth >> eihours >> eimins >> eiap >> eohours >> eomins >> eoap >> emo >> enotes;
++esno;
}
解决方法
iss{user_input}; //THIS IS WHERE I GET THE ERROR
在语法上建议在iss
中重新构造get_input
为时已晚(而且是非法的)。相反,必须使用新的user_input
重新/初始化流。
iss.clear();
iss.str(user_input);
,
简短的版本是您不能两次初始化一个对象。 Traceback (most recent call last):
File "manage.py",line 16,in <module>
execute_from_command_line(sys.argv)
File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py",line 401,in execute_from_command_line
utility.execute()
File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py",line 395,in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/local/lib/python3.8/site-packages/django_jenkins/management/commands/jenkins.py",line 47,in run_from_argv
super(Command,self).run_from_argv(argv)
File "/usr/local/lib/python3.8/site-packages/django/core/management/commands/test.py",line 23,in run_from_argv
super().run_from_argv(argv)
File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py",line 330,in run_from_argv
self.execute(*args,**cmd_options)
File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py",line 371,in execute
output = self.handle(*args,**options)
File "/usr/local/lib/python3.8/site-packages/django_jenkins/management/commands/jenkins.py",line 116,in handle
coverage.save(tested_locations,options)
File "/usr/local/lib/python3.8/site-packages/django_jenkins/tasks/with_coverage.py",line 29,in save
self.coverage.stop()
File "/usr/local/lib/python3.8/site-packages/django_jenkins/tasks/with_coverage.py",line 55,in get_morfs
return [filename for filename in coverage.data.measured_files()
AttributeError: 'Coverage' object has no attribute 'data'
被声明并构造为您班级的私有成员。当您尝试iss
时,它已经存在-不允许这样做。您不想要Initialization,而是只想用iss{user_input}
中的内容替换iss
的内容。为此,您使用std::basic_istringstream::str。成员函数user_input
允许您获取或设置str
的内容。
一个简短的例子:
istringstream
使用/输出示例
#include <iostream>
#include <sstream>
#include <string>
int main (void) {
std::istringstream iss {}; /* iss is declared/constructed */
std::string s {};
std::cout << "enter s: ";
if (!getline(std::cin,s))
return 1;
iss.str(s); /* replace iss content with s */
std::cout << "iss has: "<< iss.str() << '\n'; /* check iss contains s */
while (iss >> s) /* read each string in iss */
std::cout << s << '\n'; /* output string */
}
其他提示,请看Why is “using namespace std;” considered bad practice?。
仔细检查一下,如果还有其他问题,请告诉我。