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、または署名に一致する任意のマニピュレータである可能性があります)。

#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 に答える