从getter方法返回const和非const值

时间:2014-11-12 00:08:25

标签: c++

我问了一个问题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 ++在语言层面缺乏一些构造。

1 个答案:

答案 0 :(得分:2)

你几乎得到了它。

struct A
{
  P* get_p();
  const P* get_p() const;
};

这会重载get_p,具体取决于A是否为const。如果A是const,则直接访问指针的调用者不应该更改它。非const版本不会直接修改A,但它允许调用者通过返回的指针执行此操作。

这是具有直接访问权限的库中的常见模式。