我如何用两种方式输出 <<? C++

问题描述 投票:0回答:1

例如,如果我想有一个默认版本的输出 << and a detailed version.

myClass myObject(//Constructor parameters);

cout << myObject << "\n";
cout << myObject.detailed << "\n";

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

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

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

c++ operator-overloading ostream
1个回答
0
投票

这是我首先想到的。

它使用了一个名为

myDetail
的封装细节类,它成为父类中成员变量
detailed
的类型。

class myClass
{
    struct myDetail
    {
        myDetail(myClass& mc)
            : mc{ mc }
        {}
        myClass& mc;
    };
public:
    myDetail detailed{ *this };
    // ...
};

然后您可以编写两个版本的

operator<<
,一个用于
myClass
,另一个用于
myDetail

class myClass
{
    // Same as above, followed by...

    std::string regular{ "Regular: no detail" };
    std::string detail{ "Detailed: too much information" };

    friend std::ostream& operator<< (std::ostream& ost, myClass const& mc)
    {
        ost << mc.regular;
        return ost;
    }

    friend std::ostream& operator<< (std::ostream& ost, myDetail const& md)
    {
        ost << md.mc.detail;
        return ost;
    }
};

这是我用于测试的完整程序。

#include <iostream>
class myClass
{
    struct myDetail
    {
        myDetail(myClass& mc)
            : mc{ mc }
        {}
        myClass& mc;
    };
public:
    myDetail detailed{ *this };

    std::string regular{ "Regular: no detail" };
    std::string detail{ "Detailed: too much information" };

    friend std::ostream& operator<< (std::ostream& ost, myClass const& mc)
    {
        ost << mc.regular;
        return ost;
    }

    friend std::ostream& operator<< (std::ostream& ost, myDetail const& md)
    {
        ost << md.mc.detail;
        return ost;
    }
};

int main()
{
    myClass myObject;
    std::cout << myObject << '\n';
    std::cout << myObject.detailed << '\n';
}```
Output:
```lang-none
Regular: no detail
Detailed: too much information
© www.soinside.com 2019 - 2024. All rights reserved.