Grundlegendes zu -Weffc ++
Betrachten Sie das folgende Programm:
#include <string>
struct S {
S (){}
private:
void *ptr = nullptr;
std::string str = "";
};
int main(){}
Dies, wenn mit kompiliert-Weffc++
auf GCC 4.7.1 wird ausspucken:
warning: 'struct S' has pointer data members [-Weffc++] warning: but does not override 'S(const S&)' [-Weffc++] warning: or 'operator=(const S&)' [-Weffc++]
Das ist normalerweise kein Problem, abgesehen von ein paar Dingen mit diesem Beispiel:
Wenn ich den Konstruktor, die Zeigerdeklaration oder die Zeichenfolgendeklaration auskommentiere, verschwindet die Warnung. Das ist seltsam, weil Sie denken, dass der Zeiger alleine ausreichen würde, aber das ist nicht der Fall. Wenn Sie die Zeichenfolgendeklaration in eine Ganzzahldeklaration ändern, wird sie ebenfalls ausgeblendet, sodass sie nur angezeigt wird, wenn eine Zeichenfolge (oder möglicherweise andere Auswahlklassen) vorhanden ist. Warum verschwindet die Warnung unter diesen Umständen?
Diese Warnung wird häufig angezeigt, wenn der Zeiger nur auf eine vorhandene Variable zeigt (die am häufigsten vom Betriebssystem verwaltet wird). Da ist keinnew
, und neindelete
. Wenn die Klasse mit dem Handle in diesen Fällen kopiert wird, möchte ich keine tiefe Kopie. Ich möchte, dass beide Ziehpunkte auf dasselbe interne Objekt verweisen (wie zum Beispiel ein Fenster). Gibt es eine Möglichkeit, den Compiler dazu zu bringen, dies zu realisieren, ohne den Kopierkonstruktor und den Zuweisungsoperator unnötig zu überlasten oder die Warnung vollständig mit zu deaktivieren?#pragma
? Warum stört es mich überhaupt, wenn die Dreierregel gar nicht gilt?