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
Antwort
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.
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.
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) {}
Wenn Sie C++ 11 verwenden, denke ich, dass Sie perfekte Weiterleitung (&&) verwenden würden. – Phil1970
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.
Abhängig von Ihrer Klasse, könnte es sich als eine abstrakte Funktion erklären: 'virtual void myFunc (int & a, int & b) = 0;'. –
Ich möchte es nicht für jede Klasse erzwingen, die daraus abgeleitet ist. – gda2004
Wie ich schon sagte - je nach Klasse (vielleicht sollte ich gesagt haben "abhängig von Ihrem allgemeinen Design") –