【问题标题】:Is it bad practice to use a class for functions instead of using regular functions?将类用于函数而不是使用常规函数是不好的做法吗?
【发布时间】:2015-05-05 04:18:20
【问题描述】:

我正在编写一个程序,用于计算在期末考试中得分所需的成绩,以达到用户想要的成绩。因此,我使用单个类来获取输入并存储所有作业成绩、测试成绩等,并使用该信息来确定在期末考试中需要得分以获得所需成绩,同时考虑不同的作业和测试权重课程。

我基本上只是将我的类用作调用函数来执行任务的一种方式,而我可能只是使用普通函数就可以逃脱。我只使用一个对象。我想我不清楚的是,何时使用函数以及何时使用类?如果我只有一个对象并且只是使用该类来完成所有繁重的工作以保持我的主要功能很小,或者我应该将其全部更改为常规功能,这很糟糕吗?我只是喜欢单独文件的想法,它使事情变得整洁且易于阅读。

这是我的类成员函数部分的示例。

void Grade::setHwGrades() {
   int i = 1;
   std::cout << "What is the weight of Homework assignments? %";
   std::cin >> hwWeight;
   std::cout << "\nHow many Homework assignments did you have? ";
   std::cin >> numHw;

   // inserts each grade entered into vector homeworkGrades
   while (i <= numHw) {
      std::cout << "Homework " << i << " grade: ";
      std::cin >> grade;
      hwGrades.push_back(grade);
      ++i;
   }

   // calculates average grade for all homework assignments
   for (int i = 0; i < numHw; ++i) {
      hwAverage += hwGrades[i];
   }
   hwAverage /= numHw;
   std::cout << "__________________________" << std::endl;
   std::cout << std::setprecision(2) << std::fixed;
   std::cout << "Homework average: " << hwAverage << std::endl << std::endl;
}

构成总成绩的每个组成部分,如测试、测验、项目等,都有自己的向量和获取成绩输入的相同方式。这是一种好的做法,还是完全使用普通功能或其他东西会更好?谢谢。

【问题讨论】:

  • 看贴出来的代码,你们班做的事情太多了。将接受用户输入的代码、执行计算的代码和产生输出的代码分开到单独的函数中。将它们放在单独的类中,还是作为非成员函数更好,这可能是个人喜好问题。
  • 好的做法是不要做对你没有帮助的事情。如果上课对您没有帮助,那就不要上课。
  • 即使现在做一些额外的工作对你的代码/程序没有好处,我认为花一些精力来组织你的代码以便于维护和阅读几乎总是值得的。做到这一点的一个好方法是创建具有相关数据成员和函数的类来对它们进行操作。

标签: c++ function class


【解决方案1】:

一般来说,只要您有一些数据(成员变量)和处理该数据的密切相关的函数(成员函数),最好使用一个类。例如,class Square 可以有一个成员变量length 和一些成员函数,如area()perimeter()set_coordinates(x,y)

建议您在函数与对象没有紧密联系时使用非成员函数。在您的情况下,请尝试考虑 Grade 应该具有哪些成员函数(如果有)。如果你不能给出一个满意的答案,这意味着你的设计可能不是最好的,你应该尝试将你的问题分解为多个类。

类的设计应该几乎像一个函数:它应该只做一件事,并且做对。

【讨论】:

    【解决方案2】:

    对我来说似乎很好。班级 Grade 可能有 hwGrades 作为成员,因此可以将其保存在班级中以备后用。

    如果您的程序稍后应该扩展以处理多个学生,您只需通过为每个学生创建一个实例来重复使用 Grade 类。

    我会将平均计算作为 Grade 的单独成员函数。印刷也可能是这种情况。

    numHw 应该是一个局部变量,因为您可以稍后使用 hwGrades.size()。

    我不知道 hwWeight 因为我看不到它是如何使用的。

    顺便说一句:你确定调用函数时 hwAverage 为零吗?也许您应该在计算平均值之前将其设置为零。

    也许您还应该在除法之前检查 numHw 是否为零(或更小)。

    【讨论】:

    • 啊我以为我把它放在那里但这里是如何使用 hwAverage:
    • float Grade::getHwPoints() { return (hwAverage * hwWeight / 100); }
    • 在这种情况下,我还将 hwWeight 设为成员变量,以便可以随时计算平均值,即在输入函数之后。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 2013-03-31
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 2013-10-26
    相关资源
    最近更新 更多