类的只读和只写版本的语义
C++: Semantics for read-only and write-only versions of a class
在我的程序中,我有一个名为Foo
的数据结构。程序的一部分从一组参数构造Foo
,因此需要访问可变方法。程序的另一部分将只从Foo
读取,因此不应该访问可变方法。
实现这一点的最佳方法是什么,还是我对类应该如何工作的看法是错误的?我以前用过这种方法:
class FooR {
public:
int read() { return x; }
protected:
int x;
};
class FooRW : public FooR {
void mutate(int nx) { x = nx; }
};
但是这种方式感觉像是在滥用继承,而且我认为在程序的两个部分有两个非常相似的命名类可能会引起混淆。有更好的方法吗?你能用一些巧妙的方法使用const
吗?
@jens指出,在程序的只读部分使用const
引用应该可以工作,这使我意识到知道我的数据结构实际上是一个树是很重要的,就像:
class Foo {
public:
void splitNode();
Foo *getChild(int n) const; // const Foo?
private:
Foo *children[2];
};
是否有一种方法可以强制const Foo
只返回const
对其子节点的引用?
程序中不需要更改对象的部分应该只使用const引用,并将非可变成员函数标记为const。
class FooR {
public:
int read() const { return x; }
void mutate(int nx) { x = nx; }
private:
int x;
};
void f1(FooR const& obj)
{
int x = obj.read();
// cannot use obj.mutate(x+1);
}
void mutatingFunction(FooR&);
您可以在工厂或构建中进行构造,并返回std::unique_ptr<FooR const>
或std::shared_ptr<FooR const>
以防止其他人使用变化的接口。
同样的方法也适用于树。声明一个返回Foo const*
的const重载和一个返回非const指针的非const重载。后者不能在const引用中使用。
class Foo {
public:
void splitNode();
Foo const* getChild(int n) const;
Foo* getChild(int n);
private:
Foo *children[2];
};
相关文章:
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 何时在引用或唯一指针上使用移动语义
- 导入库可以跨dll版本工作吗
- 如何从具有移动语义的类对象中生成共享指针
- Boost Spirit,获取迭代器内部语义动作
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 在clang++预处理器中确定gcc工具链版本
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 不同的Visual Studio版本中缺少.dll
- 可以使用移动语义更改或改进此C++代码吗?
- 用符号版本替换对函数的所有调用
- c++在使用指针时移动语义
- luaL_dofile在已知良好的字节码上失败,可以使用未编译的版本
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- 我需要分发哪些版本的可再分发文件
- 在C++17中,引用const字符串的语义应该是什么
- CV_OCL_RUN宏如何在OpenCV(版本3.4.5)的goodFeaturesToTrack实现中工作?
- 在运行时读取 libstdc++ 版本
- Xcode(版本9.2(9C40B)):试图包括Boost时C 语义和链接器问题
- 类的只读和只写版本的语义