我是OOP的新手,并试图自学。
我不确定这个简单的逻辑实现(我觉得它很简单,但我有心理障碍)练习:
Employee
,name
和surname
字段salary
课程
所以,这是我的文件:
// 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
employee.cpp
#include "employee.h"
Employee::Employee(string n,string c,float stip) {
Employee::setName(n);
Employee::setSurname(c);
Employee::setSalary(stip);
}
void Employee::setName(string n){
name=n;
}
void Employee::setSurname(string c){
surname=c;
}
void Employee::setSalary(float stip){
salary=(stip>=0)?stip:0;
}
string Employee::getName(){
return name;
}
string Employee::getSurname(){
return surname;
}
float Employee::getSalary(){
return salary;
}
increase.h
#ifndef INCREASE_H
#define INCREASE_H
namespace Increase {
const float inc2017=1.1;
}
#endif // INCREASE_H
关于那个主文件我考虑了两种可能性:
1)使用变量在本地保存薪水
float prov=a.getSalary();
a.setSalary(prov*Increase::inc017);
2)在set方法中传递get方法:
a.setSalary(a.getSalary()*Increase::inc2017);
哪个更好?
数字2在逻辑上是正确的还是以这种方式绕过封装?
(我知道在这个小问题中使用命名空间标题并不是必需的,但是我正在努力开发一个更大的项目,我想为它做好心理准备)
答案 0 :(得分:1)
回答您的具体问题:在设置新值时不使用临时变量是完全可以的。
一旦提取出值,它就不可能打破封装,因为我们正在谈论根本没有触及对象内部的代码。
评论中建议的一个解决方案,可以使课程更加封闭/具体,将是一个专门的&#34;增加&#34;会员功能,但由您来决定此类是否应具有此功能内幕,或者您是否想要将增加委托给另一个组件。
根据经验,如果班级对其成员的不变量没有额外的逻辑,那么成员就可以公开 - 这样你就可以摆脱吸气者和制定者以及你的问题答案本身。
答案 1 :(得分:0)
你的getter功能是:
salary
请注意,此函数返回成员工资的副本。此函数的用户无法更改成员变量salary
的值。
如果你的getter函数返回了对salary
的引用,那么用户可能已经能够更改float& Employee::getSalary(){
return salary;
}
成员变量的值,从而打破了封装。
NSMutableDictionary *responseDict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
NSArray *postFromResponse = [responseDict valueforkey:@"credentials"];
for(NSDictionary *object in postFromResponse) {
NSString *AccessKeyId = [object valueforkey:@"AccessKeyId"];
NSLog(@"%@", AccessKeyId);
}
因此,您不应该担心使用您编写的getter函数来破坏封装。