Sales_data.h
#pragma once
#ifndef SALES_DATA_H
#define SALES_DATA_H
#include<iostream>
#include "Version_test.h"
#include "fstream"
#include <string>
class Sales_data {
friend istream &read(Sales_data &sd, istream &is);
friend ifstream &read(Sales_data &sd, ifstream &is);
friend Sales_data add(const Sales_data &sd1, const Sales_data &sd2);
friend ofstream &print(const Sales_data &sd, ofstream &os);
friend ostream &print(const Sales_data &sd, ostream &os = cout);
private:
std::string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
public:
Sales_data(const string &s, unsigned us, double re) :bookNo(s), units_sold(us), revenue(re) { }
Sales_data(const string &s) :Sales_data(s, 0, 0) { }
Sales_data():Sales_data("", 0, 0) { }
Sales_data(istream &is) { read(*this,is); }
Sales_data(ifstream &in) { read(*this, in); }
Sales_data& combine(const Sales_data&);
string isbn() const{ return this->bookNo; }
inline double avg_price() const;
};
double Sales_data::avg_price() const
{
return (this->revenue) / (this->units_sold);
}
Sales_data& Sales_data::combine(const Sales_data& sd)
{
units_sold += sd.units_sold;
revenue += sd.revenue;
return *this;
}
Sales_data add(const Sales_data &sd1, const Sales_data &sd2)
{
Sales_data total = {};
if (sd1.bookNo == sd2.bookNo) {
total = sd1;
total.units_sold += sd2.units_sold;
total.revenue += sd2.revenue;
}
else {
cerr << "Cannot add two Sales_data since their bookNos are not the same." << endl;
}
return total;
}
istream &read(Sales_data &sd,istream &is = cin)
{
is >> sd.bookNo >> sd.units_sold >> sd.revenue;
return is;
}
ifstream &read(Sales_data &sd, ifstream &is)
{
is >> sd.bookNo >> sd.units_sold >> sd.revenue;
return is;
}
ostream &print(const Sales_data &sd, ostream &os = cout)
{
os << "bookNo:" << sd.bookNo << " units_sold:" << sd.units_sold << " revenue:" << sd.revenue << endl;
return os;
}
ofstream &print(const Sales_data &sd, ofstream &os)
{
os << "bookNo:" << sd.bookNo << " units_sold:" << sd.units_sold << " revenue:" << sd.revenue << endl;
return os;
}
#endif
test.h:
#pragma once
#include"Sales_data.h"
//...
bool compareIsbn(const Sales_data &sd1, const Sales_data &sd2);
test.cpp
bool compareIsbn(const Sales_data &sd1,const Sales_data &sd2)
{
return sd1.isbn() < sd2.isbn();
}
main.cpp
int main()
{
Sales_data sd1("AAAAA");
Sales_data sd2("BBBB");
Sales_data sd3("CCC");
Sales_data sd4("DD");
vector<Sales_data> sdata_vec{sd1,sd2,sd3,sd4};
sort(sdata_vec.begin(), sdata_vec.end(), compareIsbn);
for (Sales_data &sd : sdata_vec) cout << sd.isbn() << endl;
system("pause");
}
程序运行时出现了很多很多严重的错误,Sales_data.h从头错到尾,不知道为什么。之前的程序用到Sales_data.h都能正常运行。
错误信息:
d:\visual studio 2015_projects\test\test\sales_data.h(65): error C2143: 语法错误: 缺少“;”(在“&”的前面)
1>d:\visual studio 2015_projects\test\test\sales_data.h(65): error C2433: “istream”: 不允许在数据声明中使用“friend”
1>d:\visual studio 2015_projects\test\test\sales_data.h(65): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>d:\visual studio 2015_projects\test\test\sales_data.h(65): error C2238: 意外的标记位于“;”之前
1>d:\visual studio 2015_projects\test\test\sales_data.h(66): error C2143: 语法错误: 缺少“;”(在“&”的前面)
1>d:\visual studio 2015_projects\test\test\sales_data.h(66): error C2433: “ifstream”: 不允许在数据声明中使用“friend”
1>d:\visual studio 2015_projects\test\test\sales_data.h(66): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>d:\visual studio 2015_projects\test\test\sales_data.h(66): error C2238: 意外的标记位于“;”之前
1>d:\visual studio 2015_projects\test\test\sales_data.h(68): error C2143: 语法错误: 缺少“;”(在“&”的前面)
1>d:\visual studio 2015_projects\test\test\sales_data.h(68): error C2433: “ofstream”: 不允许在数据声明中使用“friend”
1>d:\visual studio 2015_projects\test\test\sales_data.h(68): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>d:\visual studio 2015_projects\test\test\sales_data.h(68): error C2238: 意外的标记位于“;”之前
1>d:\visual studio 2015_projects\test\test\sales_data.h(69): error C2143: 语法错误: 缺少“;”(在“&”的前面)
1>d:\visual studio 2015_projects\test\test\sales_data.h(69): error C2433: “ostream”: 不允许在数据声明中使用“friend”
1>d:\visual studio 2015_projects\test\test\sales_data.h(69): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>d:\visual studio 2015_projects\test\test\sales_data.h(69): error C2238: 意外的标记位于“;”之前
1>d:\visual studio 2015_projects\test\test\sales_data.h(75): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>d:\visual studio 2015_projects\test\test\sales_data.h(75): error C2143: 语法错误: 缺少“,”(在“&”的前面)
1>d:\visual studio 2015_projects\test\test\sales_data.h(76): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>d:\visual studio 2015_projects\test\test\sales_data.h(76): error C2143: 语法错误: 缺少“,”(在“&”的前面)
1>d:\visual studio 2015_projects\test\test\sales_data.h(76): error C2535: “Sales_data::Sales_data(const int)”: 已经定义或声明成员函数
1> d:\visual studio 2015_projects\test\test\sales_data.h(75): note: 参见“Sales_data::Sales_data”的声明
1>d:\visual studio 2015_projects\test\test\sales_data.h(78): error C2061: 语法错误: 标识符“istream”
1>d:\visual studio 2015_projects\test\test\sales_data.h(78): error C2535: “Sales_data::Sales_data(void)”: 已经定义或声明成员函数
1> d:\visual studio 2015_projects\test\test\sales_data.h(77): note: 参见“Sales_data::Sales_data”的声明
1>d:\visual studio 2015_projects\test\test\sales_data.h(79): error C2061: 语法错误: 标识符“ifstream”
1>d:\visual studio 2015_projects\test\test\sales_data.h(79): error C2535: “Sales_data::Sales_data(void)”: 已经定义或声明成员函数
1> d:\visual studio 2015_projects\test\test\sales_data.h(77): note: 参见“Sales_data::Sales_data”的声明
1>d:\visual studio 2015_projects\test\test\sales_data.h(81): error C3646: “isbn”: 未知重写说明符
1>d:\visual studio 2015_projects\test\test\sales_data.h(81): error C2059: 语法错误:“(”
1>d:\visual studio 2015_projects\test\test\sales_data.h(81): error C2334: “{”的前面有意外标记;跳过明显的函数体
1>d:\visual studio 2015_projects\test\test\sales_data.h(75): error C2065: “s”: 未声明的标识符
1>d:\visual studio 2015_projects\test\test\sales_data.h(75): error C2065: “us”: 未声明的标识符
1>d:\visual studio 2015_projects\test\test\sales_data.h(75): error C2065: “re”: 未声明的标识符
1>d:\visual studio 2015_projects\test\test\sales_data.h(76): error C2065: “s”: 未声明的标识符
1>d:\visual studio 2015_projects\test\test\sales_data.h(77): error C2661: “Sales_data::Sales_data”: 没有重载函数接受 3 个参数
1>d:\visual studio 2015_projects\test\test\sales_data.h(78): error C2065: “is”: 未声明的标识符
1>d:\visual studio 2015_projects\test\test\sales_data.h(78): error C3861: “read”: 找不到标识符
1>d:\visual studio 2015_projects\test\test\sales_data.h(79): error C2065: “in”: 未声明的标识符
1>d:\visual studio 2015_projects\test\test\sales_data.h(79): error C3861: “read”: 找不到标识符
1>d:\visual studio 2015_projects\test\test\sales_data.h(103): error C2065: “cerr”: 未声明的标识符
1>d:\visual studio 2015_projects\test\test\sales_data.h(103): error C2065: “endl”: 未声明的标识符
1>d:\visual studio 2015_projects\test\test\sales_data.h(107): error C2143: 语法错误: 缺少“;”(在“&”的前面)
1>d:\visual studio 2015_projects\test\test\sales_data.h(107): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>d:\visual studio 2015_projects\test\test\sales_data.h(107): error C2086: “int istream”: 重定义
1> d:\visual studio 2015_projects\test\test\sales_data.h(65): note: 参见“istream”的声明
1>d:\visual studio 2015_projects\test\test\sales_data.h(107): error C2061: 语法错误: 标识符“istream”
1>d:\visual studio 2015_projects\test\test\sales_data.h(108): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>d:\visual studio 2015_projects\test\test\sales_data.h(108): error C2059: 语法错误:“{”
1>d:\visual studio 2015_projects\test\test\sales_data.h(108): error C2143: 语法错误: 缺少“;”(在“{”的前面)
1>d:\visual studio 2015_projects\test\test\sales_data.h(108): error C2447: “{”: 缺少函数标题(是否是老式的形式表?)
1>d:\visual studio 2015_projects\test\test\sales_data.h(112): error C2143: 语法错误: 缺少“;”(在“&”的前面)
1>d:\visual studio 2015_projects\test\test\sales_data.h(112): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>d:\visual studio 2015_projects\test\test\sales_data.h(112): error C2086: “int ifstream”: 重定义
1> d:\visual studio 2015_projects\test\test\sales_data.h(66): note: 参见“ifstream”的声明
1>d:\visual studio 2015_projects\test\test\sales_data.h(112): error C2061: 语法错误: 标识符“ifstream”
1>d:\visual studio 2015_projects\test\test\sales_data.h(113): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>d:\visual studio 2015_projects\test\test\sales_data.h(113): error C2059: 语法错误:“{”
1>d:\visual studio 2015_projects\test\test\sales_data.h(113): error C2143: 语法错误: 缺少“;”(在“{”的前面)
1>d:\visual studio 2015_projects\test\test\sales_data.h(113): error C2447: “{”: 缺少函数标题(是否是老式的形式表?)
1>d:\visual studio 2015_projects\test\test\sales_data.h(117): error C2143: 语法错误: 缺少“;”(在“&”的前面)
1>d:\visual studio 2015_projects\test\test\sales_data.h(117): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>d:\visual studio 2015_projects\test\test\sales_data.h(117): error C2086: “int ostream”: 重定义
二楼还有