【问题标题】:Overriding operator<< for console output doesn't work for member variables覆盖控制台输出的 operator<< 不适用于成员变量
【发布时间】:2012-11-11 09:15:43
【问题描述】:

我有一个 MyList 类,它覆盖 &lt;&lt; 运算符,以便能够将自身记录到控制台:

class MyList {
public:
    vector<int> *numbers;
};
ostream& operator<<(ostream& os, MyList& l);

实施:

ostream& operator<<(ostream& os, MyList& l) {
    for (int i = 0; i < l.numbers->size(); i++) {
        os << l.numbers->at(i);         
    }
    return os;
}

在另一个类中,我有一个 MyList 类型的成员变量,我无法将它打印到控制台。有趣的是,本地 MyList 变量可以正常工作:

class A {
public:
    MyList list;
    void someMethod() const;
};

实施:

void A::someMethod() const {
    MyList local;
    // Set up local list.
    cout << "Local:" << local; // OK!
    cout << "Member:" << list; // ERROR!
}

这是错误信息:

Invalid operands to binary expression ('basic_ostream<char,
std::__1::char_traits<char>>' and 'const MyList')

Xcode 的自动修复建议引用list:

cout << "Member:" << &list;

这将编译,但(显然)它打印list 的地址而不是我的内容。关于&lt;&lt; 运算符,我不明白这两个变量之间有什么区别。谁能解释一下?

【问题讨论】:

  • 由于在定义类 A 之后缺少分号,在发出一些错误诊断之前,编译器不太可能达到您声称的程度。这真的是你的真实代码吗?如果不是,您认为我们如何推断您的真实代码是什么?

标签: c++ pointers operator-overloading iostream ostream


【解决方案1】:

我认为这不是您的真实代码,但这是我的猜测:

ostream& operator<<(ostream& os, const MyList& l)
//                                 |
//                             note const

要么这样,要么像忘记尾随;这样非常愚蠢的事情:

class A {
public:
    MyList list;
    void someMethod();
};  // <------- here

【讨论】:

  • 我同意,这又是(很可能)有人相信心灵感应的案例。知道他们都来自什么文化会很有趣。例如,艾伦·图灵(Alan Turing),一个非常聪明的人,claimed to believe in ESP,他融入了 1940 年代的英国文化(我的结论是,在那种文化中,表现出相信 ESP 在社会上是必要的,或者至少在社会上非常方便)。
  • @Cheersandhth.-Alf 心灵感应?你在说什么?
  • @Javap:你的意思是 Luchian 向你展示的 const 产生了影响,这意味着你确实有一个 const -- on你的方法。未显示在您的提供的代码中。接下来,请贴出真实代码,因为我们不是电讯者:我们在远处看不到你的真实代码,我们只能看到你在这里发布的代码。
  • 好吧,你不需要心灵感应来告诉你发布的代码不是产生错误信息的代码!要显示错误消息,something() 必须是 const 成员。
  • @Cheersandhth.-Alf 错误消息确实显示const MyList。 :)
【解决方案2】:

看来,您在几个地方省略了const:就目前而言,您的代码应该没问题。但是,如果您有 const 成员函数,则成员为 const 并且您不能将非 const 引用绑定到 const 对象。因此,输出运算符通常被声明为将const&amp; 作为第二个参数:

std::ostream& operator<< (std::ostream& os, MyList const& l) {
    ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    • 2018-11-22
    • 2023-04-11
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多