类似"属性"的方法,而不是C++中的getters和setters?

"Property"-like methods instead of getters & setters in C++?

本文关键字:中的 C++ getters setters 属性 方法 类似      更新时间:2023-10-16

情况:

class Person {
public:
     int& age();
     int age() const;
private:
     int m_age;
};

我不知道这是否正如我想的那样起作用,所以我的第一个问题是:

  • 使用这些方法,我可以创建C#喜欢" properties" ?我是说:
    • 使用 first 方法,我可以实现当某物更改m_age的值时应该发生的事情。
    • 使用 second 我可以实现当某物使用M_AGE的值时应该发生的事情。

示例:

Person p;
p.age() = 15; //first method is called?
std::cout << p.age(); //second method?

我开始认为这是基于混合操作员超载和const方法的愚蠢性,所以请:有人可以启发我吗?:D

如果奇迹般地起作用,我可以使用它而不是getters&amp;设定器还是这是一个不好的练习?

您的代码编译良好并按预期工作:

#include <iostream>
class Person {
public:
     int& age() { return m_age; }
     int age() const { return m_age; }
private:
     int m_age;
};
int main () {
    Person p;
    p.age() = 15; //first method is called?
    std::cout << p.age(); //second method?
}

请参阅实时演示


如果奇迹般地有效,我可以使用它而不是getters&amp;Setters 还是这是一个不好的练习?(重点是我的)

否,这不能用作 setter 函数的真实替代品。
返回对成员变量的引用使客户端完全控制该成员变量,这与 setter 类似

不同
void age(int newValue) {
    if(newValue > 150) {
         throw std::invalid_argument("You're older than 150? We don't believe that!");
    }
    m_age = newValue;
};

是,否。

特性是用于隐藏功能的句法糖。是的。您可以编写一个返回参考的函数,并在表面上获得一些看起来像属性的东西。

但要考虑以下内容:属性背后是一个设置器函数,可以(并且应该)做更多的事情,而不仅仅是设置一个值。任何设置器的重点是确保设置值不会损害对象的状态。

通过用返回未保护的引用到private成员的函数替换设置器,您正在剥离此防御线。呼叫者可以使用该引用,因为他们认为合适,并可能损害对象。这可能很好,具体取决于会员的性质,但是您可能会说实话。声明成员public,提高可读性,并节省编写功能的麻烦。

至于问题的const部分,您可以(这是一种丑陋,简单的"某种")将int& age()视为int& age(Person * this)int age() const,为int age(const person * this)

在OP的示例中,age()从未在常数Person上调用,因此没有理由将int age() const调用。