我正在尝试编写一些代码,以便为ID号,名字,姓氏,期中分数和以下数据的最终得分创建getter和setter,这些数据位于文本文件中,在我的类中写...
10601 ANDRES HYUN 88 91 94 94 89 84 94 84 89 87 89 91
10611 THU ZECHER 83 79 89 87 88 88 86 81 84 80 89 81
10622 BEVERLEE WAMPOLE 95 92 91 96 99 97 99 89 94 96 90 97
10630 TRUMAN SOVIE 68 73 77 76 72 71 72 77 67 68 72 75
ID是第一个数字,名字和姓氏是自我解释的,中期分数是倒数第二个,最后一个数字是最终分数。这是我第一次使用getter和setter,到目前为止我有...
int getID()const{return ID;}
void setID(int i) {ID=i}
string getFname()const{return Fname;}
void setFname(string f) {Fname = f}
string getLname()const{return Lname;}
void setLname(string l) {Lname = l}
int getMidterm()const{return Midterm;}
void setMidterm(int m) {Midterm=m}
int getFinal()const{return Final;}
void setFinal(int fl) {Final=fl}
我是否在正确的轨道上?另外,如何指定数据集中的第一个数字是ID,第一个字符串是第一个名称,第二个字符串第二个名称,倒数第二个是Midterm,最后一个数字是最终得分?
答案 0 :(得分:5)
如果你问的是写吸气剂和制定者,是的,这就是有多少人这样做的。要为复杂类型编写“完美”访问器,您可以使用:
void setLname(const String& input) { Lname = input; } //copies the string
void setLname(String&& input) { Lname = std::move(input); } //moves the string
const String& getLname() const { return Lname; } //allows to get a const String reference from a const object
String& getLname() { return Lname; } //allows modifying access to Lname if the object is not const.
请注意,这不仅仅是人们通常谈论的两个,而且通常只能看到一个吸气剂和一个吸气剂。只有极少数人愿意写更多。然而,这四个中的每一个都有一个稍微不同的工作要做,可能需要添加。
然而,许多访问者都是代码味道:
他们使用不提供任何抽象的函数来丢弃代码。
每当你同时拥有一个getter和一个setter时,你对该数据成员的访问基本上是无限制的;所以你也可以写public: String Lname
。
许多访问者都是您建模数据的一个标志,而不是行为。在这些情况下,您应该重新考虑您的设计,或者诚实并继续使用公共成员,或者如果所有成员都公开,则struct
恕我直言。
请注意,我在这里谈的是纯粹的访问者,而不是那些实际做一些明智的事情,比如检查一个值范围,相应地更新其他成员,等等。而这些纯粹的是你应该避免的。
所以,如果我是你,我会问自己:我班上需要什么行为?我是否真的需要在其他代码中讨论其所有数据成员,或者我是否可以找到我的课程可以提供的合理抽象,这会使访问者无用?我是否可能正在考虑对错误的对象类进行建模?或者我真的只想要一个可以在任何地方使用和修改我的数据的容器吗?
答案 1 :(得分:1)
看起来很好。一些评论:
string
作为const string&
传递给您,这样您就不会制作无用的副本。getFirstName()
比getFname()
关于第二个问题,您可以使用C ++中提供的许多扫描/流工具,例如scanf
,sscanf
,fscanf
,stringstream
,{{1 },iostream
等
fstream
答案 2 :(得分:-1)
第1部分:
这正是getter和setter方法的样子(至少在Java中)。
第2部分:
要设置类的字段,您仍然需要手动解析输入。
我建议查看C ++ iostream,尤其是输入流的>> operator。