Abstrakte Basisklasse: Membervariable wird nicht verwendet



  • Hi, ich habe eine abstrakte Basisklasse mit einer Membervariable, die über den Konstruktor initialisiert wird und von allen abgeleiteten Klassen verwendet werden wird. Ich kompiliere im Moment mit clang und aktiviere alle Warnungen, so dass mein Compiler bemängelt, dass ich die Membervariable gar nicht verwende. Damit er Ruhe gibt, habe ich (nach etwas Googeln) einen kleinen Präprozessor-Code-Schnipsel gefunden, so dass mein Code jetzt so aussieht:

    /// Base for all object components
    class ObjectComponent {
    
    	protected:
    		// @note: member only used in derived component
    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Wunused-private-field"
    		GameObject& parent;
    #pragma clang diagnostic pop
    
    	public:
    		ObjectComponent(GameObject& parent);
    		virtual ~ObjectComponent();
    
    		virtual void update(sf::Time const & elapsed) = 0;
    		virtual void handle(ObjectEvent const & event) = 0;
    };
    

    Ist das gängige Praxis? Oder seht ihr andere Möglichkeiten das Problem zu lösen? Ich möchte prinzipiell schon die Compilerwarnungen vollständig haben - hier aber explizit nicht (ich behandle Warnungen immer absichtlich als Fehler, so dass ich nicht fertigkompilieren kann).

    LG Glocke



  • Schreib in die zugehörige CPP

    ObjectComponent::ObjectComponent(GameObject& parent_) : parent(parent_)
    {
    }
    


  • Steht bereits da:

    ObjectComponent::ObjectComponent(GameObject& parent)
    	: parent{parent} {
    }
    
    ObjectComponent::~ObjectComponent() {
    }
    

    Laut Aussage des Compilers: "Set but never used".



  • Glocke schrieb:

    Ist das gängige Praxis?

    Da es sich hier um einen Compiler-Bug handelt, ist so ein Workaround wohl angebracht. Bug, weil der Compiler ganz leicht erkennen könnte, dass die Klasse nur als abstrakte Basis gedacht ist und er deshalb in den abgeleiteten Klassen schauen müsste, ob parent verwendet wird.

    Glocke schrieb:

    Oder seht ihr andere Möglichkeiten das Problem zu lösen?

    parent privat machen und einen Getter dafür hinzufügen. Vielleicht meckert Clang dann nicht.


  • Mod

    Was passiert, wenn du parent in einem Ausruck ohne Seiteneffekte einsetzt?
    Also einfach

    parent;
    

    im Konstruktor (dort nat. this->parent) oder Destruktor (evtl. noch mit einem cast auf void versehen).



  • Sobald Du davon eine Klasse ableitest sollte die Warnung verschwinden.



  • MichelRT schrieb:

    Sobald Du davon eine Klasse ableitest sollte die Warnung verschwinden.

    Tatsache 👍


Log in to reply