对使用带有istream参数的constructurs感到困惑

时间:2014-06-08 05:26:34

标签: c++ constructor definition

在尝试学习如何创建构造函数时,我遇到了一些问题。

我目前正在使用“C ++ Primer”一书学习c ++,并且我已经告诉我要创建一些构造函数然后使用这些构造函数更改代码。练习声明我应该使用istream构造函数重写此程序,但我不知道如何执行此操作。

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

我遇到的问题是,我不知道我应该如何使用istream使用构造函数,我认为这很简单,只是将cin作为默认值传递,但它不起作用。从视觉工作室我得到"LNK2019" error and from code::blocks "undefined reference to Sales_data::read(std::istream&, Sales_data&)

我头文件中的代码如下所示:

struct Sales_data 
{
    Sales_data() = default;
    Sales_data(const std::string &s) : bookNo(s){}
    Sales_data(const std::string &s, unsigned n, double p) :
                    bookNo(s), units_sold(n), revenue(p*n){}
    Sales_data(std::istream &is) 
    {
         read(is, *this); 
    }

    std::string isbn() const { return bookNo; };
    Sales_data& combine(const Sales_data&);
    double avg_price() const;
    Sales_data add(Sales_data&, Sales_data&);
    std::ostream &print(std::ostream&, const Sales_data&);
    std::istream &read(std::istream&, Sales_data&);

    std::string bookNo;
    unsigned units_sold = 0;
    double revenue = 0.0;
};

以及下面的一些定义。

我的cpp文件如下所示:

int main()
{
    Sales_data total(cin); //results in error "LNK2019" or "undefined reference to Sales_data::read(std::istream&, Sales_data&)"

    if (1)
    { //not really sure what to use here but if I get my default value to work I might figure it out.
        // I'm thinking it should work with just cin >> total or read(total)
        Sales_data trans(cin); //results in error "LNK2019" or "undefined reference to         Sales_data::read(std::istream&, Sales_data&)"
        while (1)
        {
            if (total.isbn() == trans.isbn())
            {
                total.combine(trans);
            }
            else
            {
                print(cout, total) << endl;
                total = trans;
            }
        }
        print(cout, total) << endl;
    }
    else
    {
        cerr << "No data?!" << endl;
    }

    return 0;
}

我希望您理解我的问题,并感谢您提供的所有帮助! :)

1 个答案:

答案 0 :(得分:1)

听起来好像你错过了书中的一些代码,或者本书期望你实现其他功能,而不仅仅是构造函数。

链接器错误告诉您它无法找到read函数的实现,它应该如下所示:

std::istream& Sales_data::read(std::istream&, Sales_data&)
{
    // TODO - implementation here.
}

还值得一提的是,应该将函数实现添加到源(.cpp)文件中。