C++中的点属性访问

rob*_*son 7 c++

我是C++的新手,我真正难倒的第一件事就是如何编写一个可以使用点符号来获取属性的getter/setter.

例如,而不是:

myObj.getAlpha();
Run Code Online (Sandbox Code Playgroud)

这将是

myObj.alpha;
Run Code Online (Sandbox Code Playgroud)

在C++中使用这样的点符号是否令人不悦或者设置起来只是一种痛苦?我很难跟踪那些并非完全超出我头脑的例子,所以非常感谢任何指导!

Dan*_*ani 6

你实际上可以为一个字段实现一个 getter 和 setter

myObj.alpha
Run Code Online (Sandbox Code Playgroud)

但这很难设置并且需要代理类。
这样做的方法是:

template<typename T>
class SetterProxy
{
    T *m_T;
  public:
    SetterProxy(T &property) : m_T(&property) { }
    SetterProxy(const SetterProxy&) = delete;
    SetterProxy operator =(const SetterProxy&) = delete;
    operator T&()
    {
        return *m_T;
    }
    T &operator =(T &other)
    {
        *m_T = other;
        return *m_T;
    }
}
class MyClass
{
    int m_alpha;
  public:
    SetterProxy<int> alpha;
    MyClass() : alpha(m_alpha) { }
}
Run Code Online (Sandbox Code Playgroud)


ten*_*our 5

其他编程语言中的"属性"大多是快速简写 - 一对函数调用的表面简写.其他好处(如元数据)在C++中并不存在.您有以下选择:

  1. 制作自己的"属性".换句话说,一对getProperty()setProperty()一对功能.
  2. 将成员变量公开为public.如果您只想公开"getter",请将公共const引用公开给成员变量.
  3. 正如其他人所说的那样,写一个你作为公共成员函数公开的类,但是处理获取/设置以便你可以"拦截"它.对于它可以提供的任何好处,这是非常努力的方式.

我建议你选择最简单的选项,不要放弃类型安全和封装.只要编译器仍然阻止外部类在您的类中搞乱,公共成员变量就可以了.