我问了一个问题here没有得到理想的答案,我仍在思考这个话题,所以开始这个新问题,希望我能更好地描述我的想法。
我有这样的代码:
struct A
{
P* get_p() const;
};
void dump_p(const A *a)
{
const P* p = a->get_p();
...... dump out p's content for debugging purpose ......
}
void re-format(A *a)
{
P* p = a->get_p();
...... update p's content ......
}
你可以看到dump_p()实际上是一个只读函数,但get_p()返回一个自由指针,允许调用者自由更新数据。这是唠叨我,我在想解决方案编译器可以帮助执行语义检查。
这就是我的想法:
struct A
{
P* get_p() const;
const P* get_rdonly_p() const;
};
void dump_p(const A *a)
{
const P* p = a->get_rdonly_p();
}
void re-format(A *a)
{
P* p = a->get_p();
}
添加此get_rdonly_p(),因为c ++不允许仅使用不同返回类型的重载方法。
我疯了吗?或者你的解决方案是什么?[UPDATE] 谢谢阿德里安,这可能是解决方案。但是我仍然在撞墙 - 你提到的非const版本get_p()并不是100%满足我,函数本身不会改变任何结构A,但是我没有将它声明为const,这是唠叨。
让我继续检查你的答案,很可能是,c ++在语言层面缺乏一些构造。
答案 0 :(得分:2)
你几乎得到了它。
struct A
{
P* get_p();
const P* get_p() const;
};
这会重载get_p
,具体取决于A
是否为const。如果A
是const,则直接访问指针的调用者不应该更改它。非const版本不会直接修改A
,但它允许调用者通过返回的指针执行此操作。
这是具有直接访问权限的库中的常见模式。