Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在set方法中传递get方法_C++_Setter_Getter - Fatal编程技术网

C++ 在set方法中传递get方法

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

我是OOP新手,正在努力自学

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

  • 创建一个
    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;

}