如何解决如何为我的自定义字符串类编写自定义读取函数
嗨,我想更好地了解标准字符串类的工作原理,因此编写了一个非常简单的自定义字符串类。以下是我班的成员:
class String {
public:
String() : first_elem(nullptr),first_free(nullptr),cap(nullptr) { }
String(const String&);//copy constructor
String(std::initializer_list<char>);
void push_back(const char &ch){
check_and_allocate();
alloc.construct(last_elem++,ch);
};
void pop_back();
};
我有更多的成员函数,并且该类工作正常,但现在我正在尝试实现一个 read() 函数,该函数将从控制台读取数据(字符)到 String
对象中。这是我迄今为止尝试过的:
std::istream& read(std::istream &is,String& obj){
char ch;
while(is >> ch and ch!='\n'){
obj.push_back(ch);
}
return is;
}
我还有一个成员函数,可以根据对象是否已满动态检查和分配,并使用 std::move 重新分配。但我认为我的 read()
函数不起作用。这是一个友元函数。此外,该程序正在运行但不正确,即当我在控制台上键入内容并按 Enter 时,while 循环不会中断。我怎样才能获得想要的结果。 String 类具有 char 类型的元素。如何从控制台读取字符直到文件结束或用户按 Enter 然后将它们添加(使用 push_back())到 String 对象?我从我的 main.cpp 文件中调用 read() 函数作为 read(std::cin,mystringobject);
上面的屏幕截图显示了使用 std::cout<<ch<<std::endl;
在控制台上打印的内容
知道为什么要打印吗?
解决方法
代码看起来不错,但我将其更改为operator>>() --
std::istream & operator>>(std::istream &is,String& obj){
char ch;
while(is >> ch and ch!='\n'){
obj.push_back(ch);
}
return is;
}
这样你就可以:
cin >> obj;
这是执行此操作的常规方法。
我确实在下面的评论之后发现了一些问题,所以我写了一个完整的测试如下。我会在最后添加一些信息:
#include <iostream>
#include <string>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::string;
std::istream & operator>>(std::istream &istr,std::vector<char> & vec) {
char ch;
while (istr >> ch && ch != '\n') {
vec.push_back(ch);
}
return istr;
}
int main(int,char **) {
std::cin >> std::noskipws;
std::vector<char> vec;
cout << "Input: ";
cout.flush();
cin >> vec;
cout << "Got the vec." << endl;
string myStr(vec.begin(),vec.end());
cout << "Length of vec: " << vec.size()
<< ". Convert to string: " << myStr
<< endl;
}
查看 main()
的第一行——没有它,cin
永远不会读取换行符,并且读取器内部的循环永远不会完成。这是一个构建和运行:
$ clear && g++ -std=c++17 Foo.cpp -o Foo && Foo
Input: Test
Got the vec.
Length of vec: 4. Convert to string: Test
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。