我如何用两种方式输出 << 的内容?

0 c++ operator-overloading ostream

例如,如果我想要一个默认的输出版本<<和一个详细的版本。

myClass myObject(//Constructor parameters);

cout << myObject << "\n";
cout << myObject.detailed << "\n";
Run Code Online (Sandbox Code Playgroud)

我尝试在我的班级中制作一个修改器,但这似乎不起作用。

class myClass {
public:
   friend std::ostream& operator<<(std::ostream& output, const myClass& myObject);
   std::ostream& detailed(std::ostream& output);
}
Run Code Online (Sandbox Code Playgroud)

这给出了错误“必须调用对非静态成员函数的引用”。

n. *_* m. 9

下面是根据 iostreams 设计应该如何完成的。

#include <iostream>

class MyClass
{
    static const int flagId; // private format flag
  public:
    int x, y; // for exposition only
    static std::ios_base& detailed(std::ios_base& str) {
        str.iword(flagId) = true;
        return str;
    }
    static std::ios_base& abridged(std::ios_base& str) {
        str.iword(flagId) = false;
        return str;
    }

    friend std::ostream& operator<< (std::ostream& stream, const MyClass& myClassObj) {
        if (stream.iword(flagId)) {
            stream << "X=" << myClassObj.x << " Y=" << myClassObj.y;
            // optionally reset the flag to false
        } else {
            stream << myClassObj.x;
        }
        return stream;
    }
};

const int MyClass::flagId = std::ios_base::xalloc();

int main()
{
    MyClass myObject{1, 42};
    std::cout << MyClass::detailed << myObject << "\n";
    std::cout << MyClass::abridged << myObject << "\n";
}
Run Code Online (Sandbox Code Playgroud)