我的班级看起来像:
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;
???
答案 0 :(得分:2)
由于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;
}
答案 1 :(得分:1)
或者,如果您不喜欢使用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;
}