使用引用传递的指针重载

时间:2017-04-17 01:50:05

标签: c++ pointers reference operator-overloading

我正在尝试创建一个书店程序,用于读取用户的输入,直到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;
}
  1. 我怀疑重载不起作用,因为我正在尝试使用引用传递指针。我在这个假设中是否正确?

  2. 我理解它的方式,const CSales x将是不正确的,因为我将更改指针,而不是我指向的对象。所以这可能让我留下const CSales &*xconst CSales *&x。这两者有什么区别?

  3. 我不知道为什么x.m_revenue行不起作用,如果我没有const的运算符,为什么它是只读的?

  4. FULL CODE

    编辑:我正在使用一个指向对象的向量,因为这会使排序更有效(只移动指针,而不是对象本身)。

1 个答案:

答案 0 :(得分:1)

问题在于:

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限定。