Klassen ostream und iomanip



  • Hallo bin hier neu und hab vermutlich eine sehr blöde frage aber ich komm einfach nicht drauf

    ich habe folgendes Problem ich habe eine klasse in dieser klasse verschiedene methoden zur formatierung einer vorlage für eine tabelarische ausgabe:

    class Dive {
    	public:
    		// Constructor
    		Dive(size_t colPrecision = 3, size_t hr = 40, size_t colFormat = 10,size_t colSpace = 4, size_t colWidth = 10);
    
    		bool ScannFile(std::string const FileName);
    		void Print(std::ostream& out);
    
    		std::ostream & colPrecision (std::ostream & out);
    		std::ostream & hr (std::ostream &out);
    		std::ostream & colFormat (std::ostream & out);
    		std::ostream & colSpace (std::ostream & out);
    		std::ostream & colWidth (std::ostream & out);
    		std::ostream & Dive::Time (ostream & out, size_t index);
    
    	private:
    		//member variables
    		std::vector<TData> mvDive;
    		TData mTmp;
    		TData mTemp_Prev;
    		size_t mHr; 
    		size_t mColPrecision;
    		size_t mColFormat;
    		size_t mColSpace;
    		size_t mColWidth;
    		//member methode 
    };
    

    die methoden werden im cpp implementiert (ich nehm jetzt exemplarisch nur eine heraus)

    ostream &Dive::hr (ostream &os) {
    	os << left << setw(mHr) << setfill('-') << "-" << endl;
    	return os;
    }
    
    void Dive::Print(ostream& out) {
    
    	out << "Dive Time"; colSpace(out);
    	out	<< "Dive Depth"; colSpace(out);
    	out	<< "Down/Up" << endl;
    
    	out << setw(mColFormat+mColSpace) << "(hh:mm:ss)";
    	out	<< setw(mColFormat+mColSpace) << "(m)"; 
    	out	<< setw(mColFormat) << "(m/s)" << endl;
    	out << hr;
    
    }
    

    es will mir einfach nicht gelingen out<<hr auszugeben ich bekomm immer wieder die meldung " error C3867: "Dive::hr": Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie "&Dive::hr", um einen Zeiger auf den Member zu erstellen."

    vielleicht kann mir jemand hier helfen



  • Der Member, den du ausgeben willst, heißt mHr.
    Oder du rufst die Funktion hr auf und übergibst als Argument out.



  • hr ist eine Funktion, die eine Referenz auf ostream zurückgibt und ein ostream als Argument erwartet. Willst du vielleicht mHr in out schreiben?



  • nein die methode hr soll eine horizontale linie ausgeben
    -------------------------
    und mHr gibt dabei die anzahl der zeichen an



  • Ja, dann schreibe doch

    hr(out);
    

    Edit: Ach so, du willst einen OperatorManipulator.
    Dann musst du die Funktion static machen.

    Edit 2:
    Ah ne, static geht nicht, weil das ganze dann nicht mehr wegen mHr geht, da der Member ja nicht static ist.
    Dann musste tricksen.
    Du gibst ein Zwischenobjekt zurück, in dem Fall so etwas wie:

    struct hr_printer
    {
        std::size_t count;
    };
    

    In der Methode hr(), erzeugst du dann einen neuen hr_printer und initialisierst ihn mit der Anzahl der Zeichen:

    hr_printer hr()
    {
        return hr_printer{ mHr };
    }
    

    Für hr_printer definierst du dann noch den Ausgabeoperator, so dass dann folgender Aufruf gültig ist:

    out << hr();
    

    Oder außerhalb der Klasse:

    out << instanz.hr();
    


  • jop vielleicht war hr ein blödes bsp...;)
    ich möchte ja wenn ich mir das selbe für setw() baue auf einen stream schreiben um eine zeile mit angegebener breite zu erzeugen



  • Siehe meinen Edit, ist es das, was du willst?



  • ah ok danke ja das wars was ich wollte dankeschön
    wenn ich jedoch den operator außerhalb der klasse manipuliere würd ich das zwischen objekt nicht benötigen oder ?



  • Du meinst als freie Funktion?
    Ja, dann geht das.
    Musst nur irgendwie mHr festlegen von außerhalb.
    Oder du verwendest einen Operator mit einem Argument.
    Dann kannst du das auch mit dem Zwischenobjekt lösen, implementierst die Erstellungsfunktion dann aber so:

    hr_printer hr(std::size_t count)
    {
        return hr_printer{ count };
    }
    

    Das dann als freie Funktion.



  • ja muss ich wohl so machen das andere ist mir dann doch etwas zu konstruiert.. die idee wär eben nur gewesen das es handhabbarer gewesen wäre wenn man die werte einfach über den ctor aufruf ändern kann


Anmelden zum Antworten