类似"属性"的方法,而不是C++中的getters和setters?
"Property"-like methods instead of getters & setters in C++?
情况:
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
调用。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- .cpp和.h文件中的模板专用化声明
- 反向给定链表中的K节点
- 正在查找文档以获得PS4平台的C++中的设备信息
- enum是C++中的宏变量还是整数变量
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 将字符串存储在c++中的稳定内存中
- 文本文件中的单词链表
- 递归函数计算序列中的平方和(并输出过程)
- 如何从C++中的依赖类型中获得它所依赖的类型
- C++中的"inline"关键字
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 用C++中的一个变量定义一个常量
- vector.resize()中的分配错误
- 使用指针从C++中的数组中获取最大值
- arr[-1]在c++中的奇怪行为
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 将值指定给向量(2D)的向量中的某个位置
- 内置函数可查看CPP中的成员变量