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];
};
在我的程序中,我有一个名为 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];
};