【问题标题】:Using variable with public const modifier使用带有 public const 修饰符的变量
【发布时间】:2016-06-10 18:47:19
【问题描述】:

我想在我的类中有一个变量,当从public 范围访问时为const,当从private 或受保护的范围访问时,我想在我的类中有一个非const 的变量。我想避免使用返回对变量的 const 引用的 getter 方法。我尝试使用 using 关键字,但到目前为止没有成功。理想情况下,它看起来像这样:

class Foo
{
public:
    using var = const m_var; // This is of course gibberish
private:
    int m_var;
}

我可以添加一个公共 const 引用成员变量并让它指向私有变量,但是这样我的类会变大 4 个字节,我想避免这种情况。编译器会意识到这一点并优化该引用吗?

关于如何解决问题的任何其他想法?

【问题讨论】:

  • “我想避免使用返回对变量的 const 引用的 getter 方法。”为什么不?这是推荐的方法。从语言的角度来看,对对象的引用与直接访问对象是一样的,因此是一回事吗
  • 不,C++ 没有类似 C# 的属性
  • getter 方法可以解决问题,但看起来也很难看:object.var.incrementByOne() vs object.getVar().incrementByOne()。尽管功能相同,但它看起来更像是返回和操作变量的副本,而不是实际的变量本身。我应该补充一点,incrementByOne() 是(无论出于何种原因)const 函数。
  • 其实一点也不像。这完全在你的脑海里。这个“问题”完全是人为的,只是您对代码设置的完全任意限制的结果。这不是一个真正的问题。
  • 如果你来自另一种语言,它可能看起来像这样,但不幸的是,这是 C++ 中唯一有效的方法,所以 C++ 读者已经习惯了。顺便说一句,有没有可能在所有情况下都可以将 Foo 对象 const 设置为客户端代码?在这种情况下,您可以将 m_var 公开为公共成员,将其设为 mutable 并仅从您的私有函数中更改它。这是我现在唯一能想到的另一个hack

标签: c++ private public


【解决方案1】:

我想避免使用返回对变量的 const 引用的 getter 方法

我不知道你为什么要避免这种情况。这听起来正是您想要的(也许只是按值返回):

class Foo
{
public:
    int getVar() const { return m_var; }
protected:
    int m_var;
};

如果您有protectedprivate 访问Foo,则只需m_var。如果你不这样做,那么你有一个不允许你修改它的公共 const getVar()


真的没有其他方法可以做到这一点。您不能像在const-qualification 或 ref-qualification 上重载访问权限一样重载访问权限,因为重载决议发生在访问检查之前。这会禁止您执行类似protectedpublic 重载的操作,而protected 重载是更好的匹配。

您也不能在不引入实际引用的情况下为变量添加别名 - 但此时您正在使您的类更大,但您仍然使用不同的名称来引用 publicprotected 无论如何,此时严格来说,使用公共访问器成员函数会更好。

【讨论】:

  • 这个问题明确要求“没有吸气剂”。您可以从 cmets 推断出 OP 不喜欢调用 getter 的语法/语义,因为您可能无法判断您是直接处理值还是副本。我不同意这一点,但这是另一场辩论
  • 我并不是说您的答案是错误的方法,我只是说它没有回答问题。显然 OP 已经知道他们可以使用 getter,所以这不会添加任何东西。
  • @KABoissonneault 如果值无论如何应该是 const,我不明白副本和值本身之间有什么区别
  • @Barry 你来这里的真正原因是帮助我解决我的问题。你为什么要发布一些东西?
  • @MarcMerony 似乎您已经知道如何解决您的问题 - 您只是想以不同的、特定的方式解决问题 - 但您真正想做的事情没有任何意义。
猜你喜欢
  • 1970-01-01
  • 2016-06-03
  • 1970-01-01
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多