2017-04-17 24 views
0

我正试图创建一个书店程序,用于读取用户输入,直到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

FULL CODE。我正在使用指向对象的指针向量,因为这应该使排序更有效率(只有移动指针,而不是对象本身)。

+0

请注意,虽然输入和输出操作符在'CSales'类的范围内声明,但它们是* not *成员函数。因此你不能在输出运算符上使用'const'说明符。这会给你造成错误。 –

+0

至于你的错误,你的输入操作符*修改*对象'x'。即它不能是'const'。 –

+0

我现在明白我的'ostream'不应该有'const',但我没有'istream'中的'const'。 –

回答

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合格。

+0

我错过了这个论点,现在它是有道理的。谢谢。只是好奇,你是否会善意地在假设情况下解决我的问题2? –

+0

@HichigayaHachiman我不确定你的意思,但是, 'CSales&* x'表示'x'是一个指向引用的指针,这是没有意义的,不应该工作。 'CSales *&x'是一个指针的引用,如果你想修改指针,这是有意义的。 –

+0

这就是我想知道的,谢谢, –