将std :: unique_ptr与std :: istream一起使用?

DTS*_*ode 1 c++ stl istream unique-ptr c++11

我正在用c ++编写一个程序,它可以从std :: cin或std :: istringstream获取文件的输入(作为命令行arg传递给它).它工作正常,并使用std :: istream*进行管理.我被告知这很糟糕,处理原始指针,所以我决定将它包装在std :: unique_ptr(即std :: unique_ptr)中.问题是它无法编译.至于我可以从错误中辨别出来,std :: istream已经保护自己不被用来分配内存.我试过谷歌搜索它,但我认为之前没有人发布过这样的问题(因为我只看到只引用std :: unique_ptr的问题).有谁知道如何实现这一目标?

edit: errors: In file included from /usr/include/c++/4.8/iostream:40:0,
                 from /home/dtscode/Desktop/SLang/src/main.cpp:1:
/usr/include/c++/4.8/istream: In function ‘int main(int, char**)’:
/usr/include/c++/4.8/istream:606:7: error: ‘std::basic_istream<_CharT, _Traits>::basic_istream() [with _CharT = char; _Traits = std::char_traits<char>]’ is protected
       basic_istream()
       ^
compilation terminated due to -Wfatal-errors.
make[2]: *** [CMakeFiles/slang.dir/src/main.cpp.o] Error 1
make[1]: *** [CMakeFiles/slang.dir/all] Error 2
make: *** [all] Error 2
Run Code Online (Sandbox Code Playgroud)

响应这一行:std :: unique_ptr Stream(new std :: istream());

我也尝试过它而不调用istreams构造函数,并且在unique_ptrs构造函数中没有任何东西

编辑2:

#include <iostream>
#include  <fstream>
#include  <sstream>
#include   <vector>
#include   <string>
#include   <memory>

#include <lexer.hpp>

int main(int argc, char *argv[]) {
    std::unique_ptr<std::istream> Stream(new std::istream());
    std::vector<std::string> Arguments(argv, argv + argc);

    switch(argc) {
        case 1:
            Stream = &std::cin;
            break;

        case 2:
            Stream = new std::ifstream(Arguments[1]);
            break;

        case 3:
            if(Arguments[1] == "-c") {
                Stream = new std::istringstream(Arguments[2]);
                break;
            }

        default:
            std::cerr<<"error: invalid arguments."<< std::endl;
            return 0;
    }

    Token::Lexeme CurrentToken = Token::Start;

    while(*Stream) {
        CurrentToken = getToken(Stream);
        lex_debug();
    }

    if(Stream != &std::cin) {
        delete Stream;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Ker*_* SB 6

我会说这只是一个非常糟糕的代码.为什么不这样:

void process_input(std::istream & is);

int main(int argc, char * argv[]) {
    if (argc == 1) {
        process_input(std::cin);
    } else if (argc == 2) {
        std::ifstream is(argv[1], "rb");
        process_input(is);
    } else if (argc == 3 && strcmp(argv[1], "-c") == 0) {
        std::istringstream is(argv[2]);
        process_input(is);
    } else {
        std::cerr << "Unrecognized invocation.\n";
        return EXIT_FAILURE;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @DTSCode:a)它编译,b)它没有奇怪的所有权混淆,c)你将驱动程序代码与逻辑分开,d)逻辑代码可以单独测试,e)复杂性更低,可读性更高,f)独角兽. (6认同)