在set方法中传递get方法

时间:2017-02-06 11:55:42

标签: c++ setter getter

我是OOP的新手,并试图自学。

我不确定这个简单的逻辑实现(我觉得它很简单,但我有心理障碍)练习:

  • 使用Employeenamesurname字段
  • 创建salary课程
  • 创建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
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在逻辑上是正确的还是以这种方式绕过封装?

(我知道在这个小问题中使用命名空间标题并不是必需的,但是我正在努力开发一个更大的项目,我想为它做好心理准备)

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函数来破坏封装。