Erstellen einer benutzerdefinierten Klasse, die durch #define-makro
Ich versuche ein makro zu erstellen mit #define, das wird mir erlauben, erstellen Sie die neue Klasse auf Nachfrage. Hier ist mein code:
#pragma once
#include "PDDefFileReader.h"
#define SET_LANG( lang ) *( new std::string( lang ) )
#define LANG( cName, lName )
class cName
{
public:
cName()
{
_langName = SET_LANG( lName ); <- HERE !!!!
_reader = new PDDefFileReader( _langName );
}
~cName(){}
std::string Str(){ return _langName; }
private:
PDDefFileReader* _reader;
std::string _langName;
};
So, ich will wissen, wie sollte ich es tun, wenn ich will, dass die "lName" - parameter die definieren wie ein std::string-Objekt. Jetzt (bei der Zeile "HIER !!!!") Ich bekomme die Fehlermeldung:
Error: Identifier "lName" is undefined
Jede Idee, wenn das, was ich will zu tun ist, möglich ?
Ihnen einige Kontext, ich bin dabei ein custom-multi-language-reader. Also ich könnte einfach definieren, neue Sprache, indem er etwas wie:
LANG( Cpp, "cpp" )
LANG( Perl, "pl" )
Dank !!
- -1 nur verwenden, boiler-plate-Makros eingefügt werden, die von deiner IDE nicht von Ihrem compiler Präprozessor
- Warum bist du nicht mit Vorlagen für diese ?
- Wenn diese Klassen unterscheiden sich nur in einem string-variable,, warum haben mehrere Klassen? Warum nicht eine Klasse mit einem Konstruktor, der ein string-argument?
*( new std::string( lang ) )
ist ein Speicher-Leck. Sie wollen einfach nur_langName = lName
oder noch besser_langName(lName)
im initialiser Liste.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein makro ist leer, standardmäßig ist es nicht weiter auf die nächste Zeile, es sei denn, Sie verwenden einen
\
ganz am Ende, z.B.Ich würde geneigt sein, um Vorlagen verwenden, um Ihr problem zu lösen - das ist wirklich das, was Sie sind für.
Leider die schlechte Nachricht ist, dass template-Parameter, während Sie können, nehmen die meisten Arten nicht behandeln
char*
oderchar[]
überhaupt. Also:Ist leider illegal C++ in den meisten Fällen verwenden diese Angelegenheit, siehe diese Frage und Ihre jeweiligen Antworten.
Jedoch, Sie kann Verwendung von Vorlagen zur Umsetzung policy-based design das ist das erste Kapitel (zweite?) von Modern C++ Design, und beschrieben in dem link Recht gut. Die Idee ist, dass Sie Erben unterschiedliche (Vorlage enthalten) - Klassen die Implementierung der verschiedenen "Politiken".
Diese erzielt den gleichen Effekt, wie Sie wollen. Vorlagen werden zur Kompilierungszeit generiert für jeden Wert instanziiert, so dass, wenn ich hatte eine Klasse:
Dann würde das generieren einer
CppName
Instanz, die eine Klasse des TypscName
was erbt einige politische Funktion vonCppPolicy
.Wenn ich raten müsste, würde ich sagen, du bist zu entscheiden, was für eine Sprache, basierend auf dem Wert der Zeichenfolge an, das ist der Fall, policy-based design kann etwas, das Sie betrachten möchten. Dies hat den zusätzlichen Vorteil der Vermeidung von großen
if
Anweisungen mit string vergleicht.Jedoch, wenn Sie sich buchstäblich gerade auf der Suche nach string-Konstanten, warum nicht einfach verwenden, oder, wie vorgeschlagen, in den Kommentaren liefern sich die Konstante zu einer Instanz für jede Sprache?
Als ist, tatsächlich mit
LANG
zweimal in das gleiche Modul erzeugt einen Kompilierungsfehler, da haben Sie zwei Klassen genanntcName
.