- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我是 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 |平均:90
我卡在这里了。
我的print
和read
函数(和构造函数)。如果通过的类(class)数 > 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);
}
最佳答案
while
循环的每次迭代都会在 nextSt
中累积 markSum
值,因为它调用了 read
方法
st.markSum += mark;
你应该在迭代之前重置总和:
st.markSum = 0.0;
double mark;
for (unsigned i = 0; i < st.passCources; ++i) {
is >> mark;
st.markSum += mark;
}
关于C++ 组合从 istream 获得的类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48296349/
我正在尝试弄清楚如何让一个成员变量代表传入的 istream 或类自己创建的成员变量。 我认为,如果我动态分配类创建的 istream,那么使用指向 istream 的指针可能会起作用;然而,问题在于
我正在尝试理解这段代码 istream &read(istream &is, Sales_data &item) { double price = 0; is >> item.b
我编写了一个实现 IStream(COM 接口(interface)而不是 C++ 标准库类)的过滤器。这一切都很好,但我的问题是我不确定何时(如果有的话)我可以确定不会发送进一步的 IStream
我正在测试 C++PL 书中的一段代码并找到了下一段代码(我不想感觉我是在将它从书中复制粘贴到我的 IDE,所以我至少改变了变量名): istream& operator>> (istream& is
我正在阅读 C++ Practical Programming by Example by Andrew Koenig (Author)并在 4.1.3 Reading homework grades
我正在尝试使用 istream& getline 而不是使用 istream& operator 从文件中读取行。 结果cpp #include "Result.h" Result::Result()
我试图通过套接字连接发送图像,但我遇到了以下代码的问题: //stream to char array STATSTG myStreamStats; ULONG bytesSaved; myStrea
这里有两段代码,我起初认为它们应该是等价的: { std::ifstream stream("test.bin", std::ios_base::in | std::ios_base::bin
我在网上查了,但没找到合适的。 怎么可能有这样的主线(原始主线): int main() { Image left; std::ifstream ifs("l
假设我有以下代码: std::ifstream file(name, flags); file.seekg(0, std::ios::beg); // Check for error file.rea
在 Windows 上的 C++ 中,是否有任何简单的方法可以为现有 std::stream 对象创建 (COM) IStream 接口(interface)? 一个示例是使用 IWICStream:
考虑以下简单程序,它将输入拆分为空白并每行打印出一个非空白标记: #include int main(int argc, char* argv[]) { while (std::ci
istream& getline (istream& is, string& str); 此处 str 在换行符后终止。但是,如果我想处理 str cotents 2-3 行的情况,那么还有什么选择呢
这个问题已经有答案了: Java multiple file transfer over socket (3 个回答) 已关闭 5 年前。 我正在编写一个程序在两台计算机之间传输文件,但我没有关闭套接
void transferData(ifstream& input_file, ofstream& output_file) { char ch; while (input_file
我正在读取包含以下行的文本文件: deltaT 0.005; 在字符串中找到正确的行后,我想使用如下代码读出该值: double deltaT;
我正在查看 istream 类,但没有看到可以完全清除缓冲区并将输入设置为为下一个“干净”输入做好准备的方法。 我为我的类定义了提取运算符,在我的主程序中我要求用户输入,如下所示: while (tr
我正在编写一个解析器,之前我在尝试解析标识符(任何对 C++ 变量名有效的东西)和未闭合的字符串文字(任何以 " 开头的东西)时遇到了麻烦,但是在我的输入末尾缺少结束符 ")。我认为这是因为词法分析器
我得到了一个具有以下签名的函数。我无法改变它,我必须接受它。 void parse(std::istream & in); 我应该测试这个函数,所以基本上用预定义的内容调用它并检查值是否被正确解析。因
我的运算符(operator)有问题>> istream& operator>> (istream& is, Matrix& M) { char first; is>>first;
我是一名优秀的程序员,十分优秀!