2016-12-31 5 views
0

Ich versuche, ein C++ Makro zu schreiben, eine Reihe von Unterklassen zu definieren, mit einer Vorlage und einen Farbnamen wie so:Haben Sie Probleme mit Makros in C++

#define DECLARE_SET_ELEMENT(color) class ##color##SetElement : public SetElement { public: ##color##SetElement(std::string name); int getValue() override; }; 

so dass ich wie nutzen kann :

DECLARE_SET_ELEMENT(Blue) // -> class BlueSetElement ... 
DECLARE_SET_ELEMENT(Red) // -> class RedSetElement ... 
... 

Aber die Makrodefinition scheint nicht richtig zu funktionieren. Wie sollte es sein, damit es so funktioniert, wie ich es vorschlage?

+3

Warum verwenden Sie eigentlich keine Vorlage? Dafür sind sie buchstäblich da. –

+0

Ja, wir würden mehr Kontext brauchen, aber Makros scheinen eine komische Wahl zu sein. Wahrscheinlich möchten Sie lieber von einer gemeinsamen Basisklasse erben. –

+0

Es erbt eine gemeinsame Basisklasse, daher die 'class ...: public SetElement';) –

Antwort

3

Verwenden

#define DECLARE_SET_ELEMENT(color) class color##SetElement : public SetElement { public: color##SetElement(std::string name); int getValue() override; }; 

statt. Führende ## sind in diesem Fall nicht geeignet. Sie möchten das Schlüsselwort class nicht mit kombinieren.

+0

Ah, ich verstehe. Vielen Dank! :) –

+2

Es ist stärker als 'es gibt keine Notwendigkeit für die führende '##''; Es gibt eine absolute Anforderung, das führende '##' wegzulassen, weil das das Token 'class' mit dem colour-Argument und' SetElement' kombiniert, was zu einer völlig zerbrochenen C++ - Syntax führt. –

+2

Vielen Dank für den Vorschlag! Die Antwort wurde entsprechend geändert. – user3684240