微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何为我的自定义字符串类编写自定义读取函数

如何解决如何为我的自定义字符串类编写自定义读取函数

嗨,我想更好地了解标准字符串类的工作原理,因此编写了一个非常简单的自定义字符串类。以下是我班的成员:

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

screenshot1

上面的屏幕截图显示了使用 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 举报,一经查实,本站将立刻删除。