【发布时间】:2014-08-29 20:32:56
【问题描述】:
我正在用 c++ 编写一个程序,它可以从文件(作为命令行参数传递给它)、std::cin 或 std::istringstream 获取输入。它工作正常,并使用 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
响应这一行: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;
}
【问题讨论】:
-
“有人告诉我这很糟糕,处理原始指针” -- 你问过为什么吗?给出了什么理由?
-
是的。他们说处理原始指针和使用 stl 解决方案很危险
-
您应该要求他们更具体。无论如何,您的用例是使用原始指针的一个很好的例子。也就是说,作为非拥有的、可重新分配的参考。如果您不需要重新分配它,您可以使用引用,但代码会有点复杂,因为引用必须在创建时绑定。
-
你为什么需要
istream*为什么不直接使用std::istream -
@Ben:因为他正在尝试使用运行时多态性。
标签: c++ c++11 stl unique-ptr istream