Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 实现接口和文件读取的const方法_C++_Constants_Mutable_Const Correctness - Fatal编程技术网

C++ 实现接口和文件读取的const方法

C++ 实现接口和文件读取的const方法,c++,constants,mutable,const-correctness,C++,Constants,Mutable,Const Correctness,我有一个接口,它有很多常量方法。在接口的一个实现中,我需要从文件中读取请求的信息。例如,正如所指出的,它实际上不是const操作,因为文件句柄随着读取而改变 我知道基本上有三种选择: 1) 对每个请求使用临时文件句柄 2) 使用PIMPL 3) 在文件句柄上使用mutable 第一种选择显然是一种过度杀伤力,大量请求会增加大量开销。第二个选项增加了间接性,但似乎是相当标准的解决方案。然而,第三种选择没有间接费用和间接费用,但它基本上是一张空白支票。尽管PIMPL习语以更复杂但可以说更可控的方式做

我有一个接口,它有很多常量方法。在接口的一个实现中,我需要从文件中读取请求的信息。例如,正如所指出的,它实际上不是const操作,因为文件句柄随着读取而改变

我知道基本上有三种选择:

1) 对每个请求使用临时文件句柄

2) 使用PIMPL

3) 在文件句柄上使用
mutable

第一种选择显然是一种过度杀伤力,大量请求会增加大量开销。第二个选项增加了间接性,但似乎是相当标准的解决方案。然而,第三种选择没有间接费用和间接费用,但它基本上是一张空白支票。尽管PIMPL习语以更复杂但可以说更可控的方式做同样的事情


在不影响const正确性的情况下,在const方法中读取文件的正确/首选方法是什么?

不要直接将文件句柄对象放入类中

让您的类包含一个
std::shared_ptr
(与常规指针相反,以避免自己处理
RAII
),即使是const方法也可以使用该指针进行读取


(您可能/可能不必在类的复制构造函数和/或赋值运算符中执行某些操作,以获得这些情况下与文件句柄相关的正确语义)

(3)如果文件句柄不是对象可观察状态的一部分,则是。@RichardCriten这是棘手的部分,不是吗。文件句柄不是接口的一部分,也不能直接引用,但一旦可变,它还允许以常量方法写入文件,并且(通过接口的常量方法)可以从外部观察到。我从QObject继承,因此无需担心复制,因此可以使用std::unique_ptr。尽管这个建议很好,因为它在不受PIMPL间接影响的情况下清楚地保留了常量的正确性。只是好奇,但如果一个对象是该句柄的唯一用户,那么可变文件句柄对象会更糟糕/有问题吗?我个人不会反对使用可变对象。这仅仅是避免这样做的一种方式。