C++ 在set方法中传递get方法
我是OOP新手,正在努力自学 我不确定这个简单(我觉得很简单,但我有一个心理障碍)练习的逻辑实现:C++ 在set方法中传递get方法,c++,setter,getter,C++,Setter,Getter,我是OOP新手,正在努力自学 我不确定这个简单(我觉得很简单,但我有一个心理障碍)练习的逻辑实现: 创建一个Employee类,包含姓名、姓氏和薪资字段 创建2名员工,并在10%加薪前后打印他们的工资 下面是我的文件: // employee.h #ifndef EMPLOYEE_H #define EMPLOYEE_H #include <string> using std::string; class Employee { private: str
- 创建一个
类,包含Employee
、姓名
和姓氏
字段薪资
- 创建2名员工,并在10%加薪前后打印他们的工资
// employee.h
#ifndef EMPLOYEE_H
#define EMPLOYEE_H
#include <string>
using std::string;
class Employee {
private:
string name;
string surname;
float salary;
public:
Employee(string,string,float);
void setName(string);
void setSurname(string);
void setSalary(float);
string getName();
string getSurname();
float getSalary();
};
#endif // EMPLOYEE
关于主文件,我考虑了两种可能性: 1) 使用变量在本地保存薪资
float prov=a.getSalary();
a.setSalary(prov*Increase::inc017);
2) 在set方法中传递get方法:
a.setSalary(a.getSalary()*Increase::inc2017);
哪个更好
第2条逻辑正确吗?还是以这种方式绕过封装
(我知道在这个小问题中没有必要使用名称空间头,但我正在致力于一个更大的项目,我希望为此做好心理准备)回答您的特定问题:在设置新值时不使用临时变量是完全可以的 一旦提取出值,它就不可能破坏封装,因为我们讨论的代码根本不涉及对象的内部 注释中建议的解决方案可能会使类更加封闭/具体,将是一个专用的“增加”成员函数,但由您决定该类是否应具有此功能,或者您是否希望将增加委派给其他组件
根据经验,如果类没有围绕其成员的不变量的附加逻辑,则可以将成员公开-这样,您就不用使用getter和setter,问题本身也会得到解答。您的getter函数是:
float Employee::getSalary(){
return salary;
}
请注意,此函数将返回成员薪资的副本。此函数的用户无法更改成员变量salary
的值
如果getter函数返回了对salary
的引用,则用户可能已经能够更改salary
成员变量的值,从而破坏了封装
float& Employee::getSalary(){
return salary;
}
因此,您不应该担心用您编写的getter函数破坏封装。这个问题与getter和setter或封装无关,您发布的几乎所有代码都是无关的。您只是询问是否在使用变量之前将函数调用的结果预取到变量中,对吗?不管怎样,这是一个主观问题。你为什么不做一个
increaseSalaryBy
函数?=)^我全心全意地支持@SingerOfTheFall。封装是关于程序逻辑的,而不是尽可能详细地直接访问变量。@George,如果您的getSalary()
返回对封闭成员变量的引用,您实际上是在绕过封装:如果您想这样做,只需将salary
公开即可,我不会这样做。@George,只是不要为操作一个值而定制太多的函数,好吧,这只是应用程序的业务逻辑和重用代码的数量的问题。如果业务逻辑要求经常使用某个操作(特别是从应用程序中的多个位置使用该操作),那么它肯定应该被提取到一个单独的方法/类/任何东西中。无论如何,我觉得这有点超出了问题的范围。返回对salary
的引用破坏了封装。为什么不公开工资呢?从封装的角度看,这会有什么不同吗?通过getter函数返回对私有成员的引用与将成员声明为公共成员一样好。@Rishi我不同意。你必须毫无理由地添加另一个方法。@BartekBanachewicz,很抱歉我没有遵循。我提出的第二种方法是举例说明错误的做法,应该避免。我之所以添加它,是因为OP想知道是否使用getter方法破坏了封装。
float Employee::getSalary(){
return salary;
}
float& Employee::getSalary(){
return salary;
}