是否有非OOP版本的'属性的名称?

时间:2017-02-22 13:18:07

标签: c++

AFAIK在C ++中,我们将getter / setter函数称为' property'。 getter / setter用于获取/设置成员变量。 这样做的一个好处是我们可以倾听变化,如下所示:

// In header:
class XXX {
    int m_width{};

    void OnWidthChanged() {
    // do something...
    }

public:
    int Width() const {
        return m_width;
    }
    void Width(int val)
        m_width = val;
        this->OnWidthChanged();
    }
};
// In CPP:
XXX my_xxx;
my_xxx.Width(123);
cout << my_xxx.Width() << endl;

现在我发现静态变量可以用来实现类似的东西,<非> OOP方式的 我知道它不能处理多个实例,所以让我们假设XXX是一个对象只有一个实例。

// In header:
int XXX_Width(bool set = false, int val = 0);
void XXX_OnWidthChanged();
// In CPP:
int XXX_Width(bool set, int val) {
    static int width = 0;
    if (set) {
        width = val;
        XXX_OnWidthChanged();
    }
    return width;
}

XXX_Width(true, 123);
cout << XXX_Width() << endl;

我的问题是,是否 等函数的名称或术语? 我正在寻找一个名字,以便我可以谷歌搜索相关信息。 我要求XXX_Width()的名称。

2 个答案:

答案 0 :(得分:3)

这里有很多关于术语的混淆。

OOP只是意味着您拥有封装其功能的自治类。你的例子都使用OO,但如果它们不好或好的设计是另一回事。

  
    

现在我发现静态变量可用于以非OOP方式实现类似的东西:

  

您的示例中没有任何非OOP。然而,它可能是糟糕的OO设计,因为您的类的多个实例可能访问相同的功能。从线程安全的角度来看,它也是糟糕的设计。

有时,在本地使用静态变量是完全正常的,例如在实现“单例”类时。

  

在C ++中,我们将getter / setter函数称为'property'

不,这不是一个常用术语。 Getter / setter函数称为成员或成员函数。或者可能是公共成员职能,因为根据定义,这些必须是公开的。另一个用于它们的术语是方法

术语属性最常用于描述公共成员变量。 RAD工具通常使用术语属性来表示这些变量。

  

我的问题是,这种功能有名称或术语吗?

由调用者指定但由其他人调用的函数(类,操作系统,中断等)通常称为回调函数。这是一个相当广泛的术语。

在您的情况下,您似乎使用类似“事件”的回调函数 - 事件是一种回调函数,但是更高级别的概念。像你的例子这样的代码可以用于所谓的“事件驱动设计”,这在RAD工具中也很流行。

答案 1 :(得分:1)

应该提出的1 st 点是你的“属性块”或“getter / setter”不符合要求。 The expected declarations看起来像:

int Width() const;
void Width(const int);

因此,当你将setter更改为:XXX& Width(int)时,很明显你不是在谈论“属性块”或“getter / setters”。那么让我们来谈谈你的setter看起来像什么:

  1. width更改后进行调用。此类通话通常为interuptsignal
  2. 它返回对象的非const引用。这是operator的行为,特别是有外部版本
  3. 现在让我们来谈谈你的功能:int XXX_Width(bool set = false, int val = 0)你已经用default arguments设置它,使得它可以像你的例子中的setter或getter一样,尽管你的getter的回归很奇怪

    鉴于您提出的两个选项之间的区别,您似乎在问:

    是否有使用函数static变量的名称,而不是定义函数并为成员变量提供getter / setter?

    函数作用域static变量称为static local variable

    关于static局部变量的一个智慧词:

      

    静态局部变量与局部变量不同,因为静态局部变量只被初始化一次,无论它所驻留的函数被调用多少次,并且它的值被保留并且可以通过对函数的多次调用来访问它被声明为 [source]