C++:read-only 和 write-only 版本的 class 的语义

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 指出在程序的 read-only 部分使用 const 引用应该可行,这让我意识到知道我的数据结构实际上是一棵树很重要,例如:

class Foo {
public:
    void splitNode();
    Foo *getChild(int n) const; // const Foo?
private:
    Foo *children[2];
};

有没有办法强制 const Foo 到 return 只有 const 引用它的 children?

程序中不需要更改对象的部分应该只使用 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&);

您可以在工厂或建筑物中进行构造,并且 return std::unique_ptr<FooR const>std::shared_ptr<FooR const> 以防止其他任何人使用可变接口。

同样的方法适用于树。声明一个 const 重载 returning Foo const* 和一个非常量重载 returning 一个非常量指针。后一个不能从 const 引用中使用。

class Foo {
public:
    void splitNode();
    Foo const* getChild(int n) const;
    Foo* getChild(int n); 
private:
    Foo *children[2];
};