注册 登录
编程论坛 C++教室

求大神,帮忙分析下程序问题的原因

心空之上 发布于 2019-03-24 12:34, 2243 次点击
程序代码:
#include <iostream>
#include <string>
#include <vector>
#include <cctype>
#include <stdexcept>
using namespace std;
using std::string;
using std::vector;

struct Sales_data {
    Sales_data& combine(const Sales_data&);
    string isbn() const { return bookNo; }
    double avg_price() const;
     
    string bookNo;
    unsigned units_sold = 0;
    double revenue = 0.0;
};
Sales_data add(const Sales_data&, const Sales_data&);
ostream &print(ostream, const Sales_data&);
istream &read(istream, Sales_data&);

int main()
{
    Sales_data total;
   
    if(read(cin, total))
    {
        Sales_data trans;
        while(read(cin, trans)
        {
            if(total.isbn() == trans.isbn())
            {
                (trans);
            }
            else
            {
                print(cout, total) << endl;
                cout << '\n';
                total = trans;
            }
        }
        print(cout, total) << endl;
        
    }
    else
    {
        cerr << "No data?!" << endl;
        return -1;
    }
    return 0;
}

Sales_data& Sales_data::combine(const Sales_data &rhs)
{
    units_sold += rhs.units_sold;
    revenue += rhs.revenue;
    return *this;
}
double Sales_data::avg_price() const
{
    if(units_sold)
        return revenue/units_sold;
    else
        return 0;
}
Sales_data add(const Sales_data &lhs, const Sales_data &rhs)
{
    Sales_data sum = lhs;
    (rhs);
    return sum;
}
ostream &print(ostream &os, const Sales_data &item)
{
    os << item.isbn() << " " << item.units_sold << " " << item.revenue << " " << item.avg_price() << endl;
    return os;
}
istream &read(istream &is, Sales_data &item)
{
    double price = 0;
    is >> item.bookNo >> item.units_sold >> price;
    item.revenue = item.units_sold * price;
    return is;
}

这是问题程序的代码,无法通过编译。
编译器的错误提示是[Error] use of deleted function 'std::basic_istream<char>::basic_istream(const std::basic_istream<char>&)'
我觉得问题出在read函数上,于是我把read和print函数的定义放在main函数上面,竟然通过编译了。但是我不明白错误的原因,求大神指教。
6 回复
#2
心空之上2019-03-24 12:36
程序代码:
#include <iostream>
#include <string>
#include <vector>
#include <cctype>
#include <stdexcept>
using namespace std;
using std::string;
using std::vector;

struct Sales_data {
    Sales_data& combine(const Sales_data&);
    string isbn() const { return bookNo; }
    double avg_price() const;
     
    string bookNo;
    unsigned units_sold = 0;
    double revenue = 0.0;
};
Sales_data add(const Sales_data&, const Sales_data&);
ostream &print(ostream &os, const Sales_data &item)
{
    os << item.isbn() << " " << item.units_sold << " " << item.revenue << " " << item.avg_price() << endl;
    return os;
}
istream &read(istream &is, Sales_data &item)
{
    double price = 0;
    is >> item.bookNo >> item.units_sold >> price;
    item.revenue = item.units_sold * price;
    return is;
}

int main()
{
    Sales_data total;
   
    if(read(cin, total))
        Sales_data trans;
        while(read(cin, trans))
            if(total.isbn() == trans.isbn())
            {
                (trans);
            else
            {
                print(cout, total) << endl;
                cout << '\n';
                total = trans;
            }
        }
        print(cout, total) << endl;
        
    }
    else
    {
        cerr << "No data?!" << endl;
        return -1;
    }
    return 0;
}

Sales_data& Sales_data::combine(const Sales_data &rhs)
{
    units_sold += rhs.units_sold;
    revenue += rhs.revenue;
    return *this;
}
double Sales_data::avg_price() const
{
    if(units_sold)
        return revenue/units_sold;
    else
        return 0;
}
Sales_data add(const Sales_data &lhs, const Sales_data &rhs)
    Sales_data sum = lhs;
    (rhs);
    return sum;
}

这是通过编译的代码

[此贴子已经被作者于2019-3-24 12:37编辑过]

#3
心空之上2019-03-24 12:37
只有本站会员才能查看附件,请 登录

这是错误提示
#4
Jonny02012019-03-24 14:14
所有的流都是不可以被复制的
所以只能传对应的引用或者指针
#5
心空之上2019-03-24 15:22
回复 4楼 Jonny0201
对呀,我声明和定义里传的都是流的引用呀。调用read函数时传入cin有错误吗?
#6
Jonny02012019-03-24 17:52
回复 5楼 心空之上
你检查一下第一个代码的声明
#7
心空之上2019-03-24 18:22
回复 6楼 Jonny0201
哎呀,我太粗心了,没仔细看自己的声明就来问问题,谢谢你了!
1