2

因此,我一直在尝试更加严格地制作任何不应被函数触及的传递参数const

我在一些 C++ 代码中遇到的一种情况是对象可能会更改,但我想“锁定”函数以防止访问对象的某些关键功能。例如,对于std::ifstream文件句柄,我可能希望阻止函数关闭文件。

如果我将它作为 a 传递const &,则该const部分似乎使我无法执行标准文件 i/o。

例如,我想要一些类似的东西

void GetTags(Arr<std::string> & tags, std::ifstream const& fileHandle)

...但是以允许文件 i/o 但不允许打开/关闭操作的方式编写。

在 C++ 中有没有好的/可靠的方法来做到这一点?什么被认为是最佳实践?

4

4 回答 4

6

标准库设计已经为您完成了这项工作:改为传递对类的引用std::istream,它没有打开或关闭的概念 - 它只公开接口。

void stream_me(std::istream & is);

std::ifstream is("myfile.txt");
stream_me(is);
于 2012-09-05T15:37:22.060 回答
1

在你的地方,我只是通过 astd::istream代替。

于 2012-09-05T15:38:10.080 回答
0

您可以将 ifstream 包装在一个对象中,该对象仅公开您希望调用者能够使用的功能。

但是,如果你有一堆不同的函数,每个函数都有不同的 ifstream 功能子集,你最终会得到很多不同的包装类;所以我不认为这是一个通用的解决方案。

于 2012-09-05T15:33:07.147 回答
0

我认为最好的方法是将其包装在一个新类中,该类仅具有与您想要访问ifstream的功能相对应的成员函数。GetTags然后将其ifstream作为第二个参数传递给GetTags.

于 2012-09-05T15:33:54.013 回答