1

我的课看起来像:

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;

???

4

2 回答 2

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;
}
于 2013-05-29T18:51:29.033 回答
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;
}
于 2013-05-29T20:24:33.627 回答