va_start und non-POD
-
ich habe einge einge String Klasse geschrieben und möchte diese nun an eine Funktion mit einer Variablenanzahl von Parametern übergeben
class ServUDllStr { public: ServUDllStr(); ServUDllStr( char c ); ServUDllStr( const char* pszString ); ServUDllStr( const string& sString ); // ... }; bool SendF( const ServUDllStr& sFormat, ... ) { va_list va; va_start( va, sFormat ); // ... }das ganze läuft ohne Problem mit Visual Studio, jedoch meint gcc
[...] warning: cannot pass objects of non-POD type `const class ServUDllStr' through `...'; call will abort at runtime
[...] warning: second parameter of `va_start' not last named argumentwie cann ich meine Klasse zu einem POD type machen?
vielen Dank im Vorraus
-
ScriptGod schrieb:
ich habe einge einge String Klasse geschrieben und möchte diese nun an eine Funktion mit einer Variablenanzahl von Parametern übergeben
lass es besser bleiben. überladene funktionstemplates oder verkettung von funktionsaufrufen ist i.allg. die bessere methode.
class ServUDllStr { public: ServUDllStr(); ServUDllStr( char c ); ServUDllStr( const char* pszString ); ServUDllStr( const string& sString ); // ... }; bool SendF( const ServUDllStr& sFormat, ... ) { va_list va; va_start( va, sFormat ); // ... }das ganze läuft ohne Problem mit Visual Studio, jedoch meint gcc
[...] warning: cannot pass objects of non-POD type `const class ServUDllStr' through `...'; call will abort at runtime
[...] warning: second parameter of `va_start' not last named argumentwie cann ich meine Klasse zu einem POD type machen?
das ist sogar in zweierlei hinsicht verboten, denn der 2. parameter von va_start darf keine referenz sein
ein POD wirst du kaum als stringklasse verwenden können, denn ein POD hat u.a. keine selbstdefinierten konstruktoren und destruktoren - damit fällt dynamische speicherverwaltung schon mal aus (ein smartpointer hilft auch nicht, denn ein POD kann selbst nur POD-member haben).
-
Hi,
Also grob gesagt haben POD-Typen keine V-Tables (also keine Virtuellen Funktionen, wurden nirgendwo abgeleitet etc)
Auch dürfen POD-Typen keine "nicht-POD-Typen" enthalten.Alle eingebauten Typen wie (int, char, long,...) etc sind POD-Typen ausserdem zählen auch Zeiger dazu.
Strukturen können POD-Typen sein wenn Sie den oben genannten Anforderungen entsprechen.
BR
Vinzenz
-
camper schrieb:
ScriptGod schrieb:
ich habe einge einge String Klasse geschrieben und möchte diese nun an eine Funktion mit einer Variablenanzahl von Parametern übergeben
lass es besser bleiben. überladene funktionstemplates oder verkettung von funktionsaufrufen ist i.allg. die bessere methode.
Ich brauchte eine String-Klasse, die etwas mehr bereitstellte als die Standard string-Llasse - unter anderem nicht case-sensitive etc - Ich fand das ein wenig unelegant, das in extra "globale" Methoden oder eine eigene Klasse zu packen.
Aber Danke mal für eure Antworten... in meinem Fall hab ich das einfach auf ein const char* geändert, reicht für den Zweck auch aus
-
Andere Idee: Überlade den Operator ',', so wie es auch Boost::Spirit macht, z.B. um Symboltabellen zu initialisieren [1]. Hierzu braucht man eine Zusatzklasse, welche die Stringvariablen zusammensammelt (in der Datei boost/spirit/symbols/symbols.hpp findet sich ein Beispielcode).
Diese Lösung finde ich zwar auch problematisch, weil sie das POLS vollkommen zerstört, aber das ist in C++ sowieso nicht oft gegeben.
[1] http://spirit.sourceforge.net/distrib/spirit_1_8_3/libs/spirit/doc/symbols.html
-
danke für die Idee, jedoch werde ich aus dem Beispiel nicht wirklich schlau, wie man den operator definieren muss, und wie das mir bei meinem Problem helfen kann
und google gibt auch nicht wirklich viel, über den operator her