我正在尝试创建一个书店程序,该程序从用户读取输入内容,直到EOF。为此,除其他外,我使istream >> operator重载。

class CSales {
public:
    //constructors

    friend ostream & operator << ( ostream &os, const CSales &x ) const;
    friend istream & operator >> ( istream &is, const CSales &x );

    //m_vars
};
istream & operator >> ( istream &is, const CSales &x ) {
    /* following line prints error:
     * no match for 'operator>>' */
    if ( is >> x.m_isbn >> x.m_price >> x.m_count ) {
        x.m_revenue = x.m_count*x.m_price; //assignment of member is read-only object
    }

    return is;
}

int main() {
    vector<CSales*> dbs1;
    CSales *candidate = new CSales();

    while ( cin >> *candidate ) {
        //sorted by isbn
        auto iter = lower_bound(dbs1.begin(), dbs1.end(), candidate, cmp_isbn);
        //operations

    return 0;
}



我怀疑重载不起作用,因为我正在尝试使用引用传递指针。我的假设正确吗?
按照我的理解,const CSales x是不正确的,因为我将更改指针而不是指向的对象。因此,可能只剩下const CSales &*xconst CSales *&x。两者之间有什么区别?
我不知道为什么x.m_revenue行不起作用,如果我没有const运算符,为什么它是只读的?


FULL CODE

编辑:我使用的是指向对象的指针向量,因为这应该使排序更有效率(仅移动指针,而不是对象本身)。

最佳答案

这是问题所在:

istream & operator >> ( istream &is, const CSales &x ) {
//                                   ^^^^^


这告诉编译器x是常量,您将不会修改x。但是因为它是输入运算符,所以它肯定会修改x,否则就没有多大意义。

错误消息“分配只读对象的成员”应该是关于此问题的非常清楚的提示。

您对指针问题的怀疑是一个红色的鲱鱼(但是我仍然建议您研究一种不使用指针的方法,现代C ++中的指针通常不需要多态性)。



为了澄清我的第一个评论:

class CSales {
public:
    ...
    friend ostream & operator << ( ostream &os, const CSales &x ) const;
    //                                                            ^^^^^
    ...
};


operator<<函数是非成员函数,因此添加const限定符应导致生成错误。只有成员函数可以是const限定。

09-10 04:04
查看更多