2014-02-12 5 views
6

Ich bekomme Warnungen über nicht verwendete Variablen, aber ich möchte nichts mit ihnen in der Basisklasse tun. Ich möchte die abgeleiteten Klassen implementieren sie, wenn sie wollen, und nichts zu tun, wenn sie sie nicht implementieren. Was kann ich tun, um die Warnungen zu stoppen, außer dem Compiler ein Flag zu setzen?C++ virtuelle Funktion mit Argumenten, die Warnungen erhalten, wenn sie nicht verwendet werden

+0

Abhängig von Ihrer Klasse, könnte es sich als eine abstrakte Funktion erklären: 'virtual void myFunc (int & a, int & b) = 0;'. –

+0

Ich möchte es nicht für jede Klasse erzwingen, die daraus abgeleitet ist. – gda2004

+0

Wie ich schon sagte - je nach Klasse (vielleicht sollte ich gesagt haben "abhängig von Ihrem allgemeinen Design") –

Antwort

20

einfach nicht geben ihnen einen Namen:

virtual void myFunc(int&, int&); 
+0

+1, aber Ihr Lieblingslied Link ist gebrochen :( – Maroun

+0

@ ᴍarounᴍaroun Danke, behoben :) – jrok

+0

Warum benennt sie nicht die Warnung loswerden? – gda2004

4

definierten Versuchen Sie die Funktion ohne Namen von Parametern wie

virtual void myFunc(int& ,int& ) 
{ 

} 

auch die Möglichkeit in Betracht ziehen tto die Basisklasse zu machen abstrakte

virtual void myFunc(int& a,int& b) = 0; 

wenn es einfach eine Schnittstelle spezifiziert.

8

Da Sie diese nicht verwenden möchten, können Sie die Parameternamen ausgeben.

Doch anstatt sie vollständig zu entfernen, ist es manchmal sinnvoller, sie so kommentieren Sie:

virtual void myFunc(int& /* a */ , int& /* b */) 
{ 
} 

Auf diese Weise kann man noch sehen, was die Absicht des Parameters, indem man den auf Kommentar Namen war. Dies ist besonders nützlich, wenn Sie die Implementierung in die Kopfzeile einfügen, da dies die einzige Stelle ist, an der die Parameternamen erwähnt werden.

4

Sie haben mehrere Möglichkeiten, um schweigen diese Warnung

  • sie von der Deklaration/Definition entfernen:

    virtual void myFunc(int& /* a */ , int& /* b */) {} 
    

    Diese Lösung einige Warnungen mit etwas Werkzeug als Doxygen provozieren ...

  • Verwenden Sie einen Trick, um zu sagen, dass das Argument nicht verwendet wird:

    oder in C++ 11:

    template <typename ... Ts> void unusedArgs(const Ts...&) {} // Helper function. 
    
    // In the class 
    virtual void myFunc(int& a, int& b) { unusedArgs(a, b); } // C++11 
    
  • In C++ 17, können Sie auch Attribut [[maybe_unused]] verwenden:

    // In the class 
    virtual void myFunc([[maybe_unused]] int& a, [maybe_unused]] int& b) {} 
    
+0

Wenn Sie C++ 11 verwenden, denke ich, dass Sie perfekte Weiterleitung (&&) verwenden würden. – Phil1970

0

Unter bestimmten Compiler, können Sie einfach schreiben der Variablenname als "no-op" -Anweisung.

virtual void myFunc(int& a, int& b) 
{ 
    a; // unused variable 
    b; 
} 

jedoch andere Compiler zu unterstützen und die Absicht klar zu machen, können Sie einen Makro oder eine Funktion verwenden unused_argument um deutlich zu machen.

Wenn das nicht mit Ihrem Compiler funktioniert, denke ich, dass sizeof(a); funktioniert.