3

我正在尝试编写一些代码来为以下数据的 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,最后一个数字是最终分数?

4

3 回答 3

5

如果你问的是写 getter 和 setter,是的,有多少人这样做。要为复杂类型编写“完美”访问器,您将使用以下命令:

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。只有极少数人愿意写更多。然而,这四个中的每一个都有稍微不同的工作要做,并且可能建议添加。

但是,许多访问器是代码异味:

  1. 他们用不提供任何抽象的函数乱扔代码。

  2. 每当您同时拥有 getter 和 setter 时,您基本上就可以不受限制地访问该数据成员;所以你也可以写public: String Lname

  3. 大量访问器表明您正在建模数据,而不是行为。在这些情况下,您应该重新考虑您的设计,或者诚实并继续使用公共成员,或者,如果所有成员都是公共的,struct恕我直言。

请注意,我在这里谈论的是纯粹的访问器,而不是那些实际上做一些明智的事情的访问器,例如检查值范围,相应地更新其他成员等等。这些纯粹的是你应该避免的。

所以,如果我是你,我会问自己:我需要课堂上的什么行为?我真的需要在其他代码中讨论它的所有数据成员,还是我可以找到我的类可以提供的合理抽象,这会使访问器无用?是否有可能我正在考虑对错误的对象类别进行建模?或者我真的只是想要一个可以在任何地方使用和修改的数据容器?

于 2013-09-13T19:11:29.077 回答
1

看起来不错。一些评论:

  • 通过stringconst string&这样你就不会制作无用的副本。
  • 更多的空白将有助于提高可读性
  • 不要缩写东西。getFirstName()getFname()

至于您的第二个问题,您可以使用 C++ 中提供的许多扫描/流实用程序,例如scanf, sscanf, fscanf, stringstream, iostream,fstream等。

std::ifstream inFile("database.txt");
std::string line;
while (std::getline(inFile, line)) // for each line
{
    std::stringstream ss;
    ss << line;

    int id;
    ss >> id;

    std::string firstName;
    ss >> firstName;

    // etc
}
于 2013-09-13T02:53:27.213 回答
-1

第 1 部分:
这正是 getter 和 setter 方法的外观(至少在 Java 中)。

第 2 部分:
要设置类的字段,您仍然必须手动解析输入。我建议研究 C++ iostream,尤其是输入流的>> 运算符。

于 2013-09-13T02:51:51.593 回答