如何为我的类创建endl操纵器
How to create endl manipulator for my class?
我的类是这样的:
class FileOut
{
private:
std::ofstream stream;
public:
FileOut(string sciezka);
~FileOut(void);
friend FileOut & operator<< (FileOut & obiekt, const char* w);
friend FileOut & operator<< (FileOut & obiekt, const string & w);
friend FileOut & operator<< (FileOut & obiekt, const char & znak);
friend FileOut & operator<< (FileOut & obiekt, const int & liczba);
friend FileOut & operator<< (FileOut & obiekt, const double & liczba);
friend FileOut & operator<< (FileOut & obiekt, std::endl);
//friend FileOut & endl (FileOut & obiekt);
};
operator<<
适用于字符串,char, int等(我将新字符放入stream
)。我想为我的班级实现机械手endl
。通常我们这样重写它:
ostream & endl (ostream & os){ return os << 'n'; }
但是对我的课不起作用。我声明
friend FileOut & endl (FileOut & obiekt);
但它不起作用。我怎样才能写:
FileOut save("file.txt");
save<<"tralalala"<<endl<<1123;
? ?
由于std::eol实际上是与ostream& (*fctr) (ostream&)
兼容的类型的函数模板,因此需要重载以下操作符:
class FileOut
{
//...
friend FileOut & operator<< (FileOut & obiekt, ostream& (*fctr) (ostream&))
//...
};
在重载中,您需要确保fctr实际上匹配eol(它可以是eof, tab或任何匹配签名的操纵符),然后将您想要写入eol上的文件的任何内容:
#include <fstream>
#include <string>
#include <iostream>
using namespace std;
class FileOut
{
private:
std::ofstream stream;
public:
FileOut(std::string sciezka):stream(sciezka) {};
~FileOut(void){};
friend FileOut & operator<< (FileOut & obiekt, const char* w) {obiekt.stream<<w;return obiekt;} ;
friend FileOut & operator<< (FileOut & obiekt, const string & w);
friend FileOut & operator<< (FileOut & obiekt, const char & znak);
friend FileOut & operator<< (FileOut & obiekt, const int & liczba){obiekt.stream<<liczba;return obiekt;};
friend FileOut & operator<< (FileOut & obiekt, const double & liczba);
friend FileOut & operator<< (FileOut & obiekt, ostream& (*pf) (ostream&));
//friend FileOut & endl (FileOut & obiekt);
};
FileOut & operator<< (FileOut & obiekt, ostream& (*pf) (ostream&))
{
if(pf==&std::endl)
{
obiekt.stream<<"MY FAT JUICY EOL";
}
return obiekt;
}
int main(int argc, char* argv[])
{
FileOut save("file.txt");
save<<"tralalala"<<endl<<1123;
return 0;
}
或者,如果您不喜欢使用std::eol而希望使用自己的:
#include <fstream>
#include <string>
#include <iostream>
using namespace std;
class FileOut
{
private:
std::ofstream stream;
public:
FileOut(std::string sciezka):stream(sciezka) {};
~FileOut(void){};
friend FileOut & operator<< (FileOut & obiekt, const char* w) {obiekt.stream<<w;return obiekt;} ;
friend FileOut & operator<< (FileOut & obiekt, const string & w);
friend FileOut & operator<< (FileOut & obiekt, const char & znak);
friend FileOut & operator<< (FileOut & obiekt, const int & liczba){obiekt.stream<<liczba;return obiekt;};
friend FileOut & operator<< (FileOut & obiekt, const double & liczba);
friend FileOut & operator<< (FileOut & obiekt, void (*pf) ());
static void eol() {};
//friend FileOut & endl (FileOut & obiekt);
};
FileOut & operator<< (FileOut & obiekt, void (*pf) ())
{
if(pf == FileOut::eol)
{
obiekt.stream<<"MY FAT JUICY STATIC EOL";
}
return obiekt;
}
int main(int argc, char* argv[])
{
FileOut save("file.txt");
save<<"tralalala"<<FileOut::eol<<1123;
return 0;
}
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- C++setiosflags函数操纵器-未确定的缩进
- C++表达SFINAE和ostream操纵器
- 操纵安卓相机的深度图导致应用程序崩溃
- 什么是现实中的"endl"(或任何输出操纵器)?它是如何实现的,它如何与操作员<<一起工
- std::endl,在 Python 中是否有等价物?(返回 + 刷新)
- 运算符 << 操作加载的 API for std::endl?
- 我在 C++ 中创建了一个函数来递归反转字符串,但是之后如何使功能打印一个 endl?
- 可变参数模板函数:调用没有匹配函数,std::endl
- 有关具有编译错误的操纵列表的问题
- C++自定义流操纵器,用于更改流上的下一个字符串
- 如何使用自定义流操纵器在类实例中保存数据
- 如何键入用于const对象的自定义io操纵器
- 如何实现接受参数的自定义流操纵器?
- 模板推导不适用于 std::endl?
- std::cout << glGetString(GL_RENDER) << std::endl;抛出错误但不GL_Renderer或GL_Verision,我不知道为什么?
- std::flush 不起作用,而 std::endl 可以
- "cout<<count<<endl;"没有打印任何内容
- 如何正确实现C++流操纵器endl
- 如何为我的类创建endl操纵器