例如,如果我想有一个默认版本的输出 << 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);
}
这给出了错误“必须调用对非静态成员函数的引用”
这是我首先想到的。
它使用了一个名为
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