C ++结合了从istream获得的类对象

时间:2018-01-17 08:11:36

标签: c++ class

我是C ++的新手。这实际上是我写的第一个类(一些代码来自 C ++ Primer )。尝试组合具有相同名称的类对象时,我遇到了逻辑错误。事情是这样的:

  • 我班上有学生记录:姓名,通过的课程数量和 总标记数(计算标记平均值)
  • 构造函数从istream

    获取数据
    struct StudentEntry {
        StudentEntry() = default;
        StudentEntry(std::istream &);
    
        std::string getStudentName() const { return name; }
        StudentEntry& combine (const StudentEntry&);
        double avgMark() const;
    
        std::string name = "";
        unsigned passCources = 0;
        double markSum = 0.0;
    };
    
  • combine函数是指+ =数据成员(passCources& markSum):

    StudentEntry& StudentEntry::combine(const StudentEntry& st) {
        passCources += st.passCources;
        markSum += st.markSum;
        return *this;
    }
    
  • avgMark正在计算标记平均值:

    double StudentEntry::avgMark() const {
        return passCources ? markSum / passCources : 0;
    }
    
  • 当我在main中合并超过2个对象时,我出错了 标记总和和平均值

    int main() {
        StudentEntry st;
        if (read(std::cin, st)) {
            StudentEntry nextSt;
            while (read(std::cin, nextSt)) {
                if (st.getStudentName() == nextSt.getStudentName())
                    st.combine(nextSt);
            }
        }
        print(std::cout, st);
    }
    
  • 结果错误:

    Next -> 
    Nick 1 90
    Next -> 
    Nick 1 90
    Next -> 
    Nick 1 90
    Next -> 
    Nick 3 360   | Average: 120
    
  • 应该是Nick 3 270 | Average: 90

  • 我被困在这里。

  • 我的printread函数(以及构造函数)。如果通过的课程数量> 1,read应该得到所有后续标记。

    std::ostream& print(std::ostream &os, const StudentEntry &st) {
        os << st.getStudentName() << " " << st.passCources << " " << st.markSum
                << "\t | Average: " << st.avgMark() << "\n";
        return os;
    }
    
    std::istream& read(std::istream &is, StudentEntry &st) {
        std::cout << "Next -> " << std::endl;
        is >> st.name >> st.passCources;
        double mark;
        for (unsigned i = 0; i < st.passCources; ++i) {
            is >> mark;
            st.markSum += mark;
        }
        return is;
    }
    
    StudentEntry::StudentEntry(std::istream &is) {
        read(is, *this);
    }
    

1 个答案:

答案 0 :(得分:1)

while循环的每次迭代都会在markSum中累积nextSt个值,因为它调用的read方法内部

st.markSum += mark;

你应该在迭代之前重置总和:

st.markSum = 0.0;
double mark;
for (unsigned i = 0; i < st.passCources; ++i) {
    is >> mark;
    st.markSum += mark;
}