c++ - 使用引用传递的指针重载

标签 c++ pointers reference operator-overloading

我正在尝试创建一个书店程序,该程序在 EOF 之前读取用户的输入。为此,我重载了 istream >> 运算符 等。

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 .

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

最佳答案

问题是:

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

关于c++ - 使用引用传递的指针重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43444114/

相关文章:

c++ - 修改,阻止 HTTP 连接

c++ - 为什么 static_cast 需要指针或引用?

c++ - 在结构指针中修改 C 字符串

c++ - 引用的初始化

c++ - 返回对对象构造函数的引用

c++ - 传递对 C++ 构造函数的引用并将它们保存为引用或非引用类型

c++ - 使用多集输入整数出现的次数

c++ - 为什么我可以毫无错误地转换不相关类的指针?

c++ - 如何将 Vulkan 添加到跨平台 CMake 项目中?

c - *str 和 *str++