1

我想要这个:

class Test {
  private:
    int a;

  public:
    int a();
    int setA(int val);
}

在我看来,Qt 图书馆一直在这样做。但我得到一个“声明blabla”编译器错误。这是为什么?我真的必须命名方法getA()吗?

我什至尝试过使用 Q_PROPERTY:

class Test : public QObject {
  Q_OBJECT
  Q_PROPERTY(int a READ a WRITE setA)

  public:
    int a(){return a}
    int setA(int val){a=val;}
}

这也行不通。

4

1 回答 1

4

在 Qt 本身中,数据成员通常位于 Private 类(Pimpl idiom)中,所以这不是问题。如果您不使用 Pimpl(这有点乏味,并且只有在您必须保证二进制兼容性时才真正需要,或者有一个非常大的项目,其中减少包含具有足够显着的效果),最常见的方法是预先添加成员带有前缀,例如 m_:

    Q_PROPERTY(int a READ a WRITE setA)

public:
    void setA( int a ) { m_a = a; }
    int a() const { return m_a; }

private:
    int m_a;

另一个优点是成员变量和局部变量总是很容易相互区分。

备择方案:

  • 通过this->a(比 m_a 更繁琐)访问变量
  • 使用 getA() (制作丑陋的 API,恕我直言,但当然取决于您的 API 风格 - 如果其他所有内容都使用 get*,则应该效仿)
于 2013-01-08T12:36:22.613 回答