在我的程序中,我有一个名为Foo
的数据结构。程序的一部分从一组参数构造Foo
,因此需要访问mutative方法。该程序的另一部分只能从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
个引用?
答案 0 :(得分:4)
程序中不需要更改对象的部分应该只是使用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>
以防止其他人使用变异界面。
同样的方法适用于树。声明一个const-overload返回Foo const*
,一个非const重载返回一个非const指针。后一个不能用于const引用。
class Foo {
public:
void splitNode();
Foo const* getChild(int n) const;
Foo* getChild(int n);
private:
Foo *children[2];
};