rule-of-three

___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ qstnhdr ___ Understanding -Weffc ++ ___ tag123pointer ___ Datentyp, der auf einen anderen gespeicherten Wert zeigt. Eine Zeigervariable enthält eine Speicheradresse einer anderen Entität (Variable oder Funktion oder andere Entität). Dieses Tag sollte für Fragen verwendet werden, bei denen Zeiger und keine Referenzen verwendet werden. Die gebräuchlichsten Programmiersprachen, die Zeiger verwenden, sind C-, C ++ -, Go- und Assemblersprachen. Verwenden Sie ein bestimmtes Sprach-Tag. Andere hilfreiche Tags sind Methode, Funktion, Struktur usw., die die Verwendung von Pointer beschreiben. ___ answer11529328 ___

GCC %code% hat mehrere Probleme, ich benutze es nie. Der Code, der nach "Problemen" sucht, ist ziemlich einfach und daher sind die Warnungen viel zu unverblümt und wenig hilfreich.

Diese besondere Warnung basiert auf Punkt 11 der ersten Ausgabe von Effective C ++ und Scott hat es in späteren Ausgaben geändert (zum Besseren). Der G ++ - Code überprüft nicht die tatsächliche dynamische Zuweisung, sondern nur das Vorhandensein von Zeigerelementen.

Siehe, was ich über diese Warnung in GCC Bugzilla geschrieben habe, wenn ich die Richtlinien in die erste Ausgabe mit der dritten Ausgabe:

  
    

Punkt 11: Definieren Sie einen Kopierkonstruktor und einen Zuweisungsoperator für Klassen mit     dynamisch zugeordneter Speicher.

  
     

Ersetzt durch Punkt 14: "Denken Sie sorgfältig über Kopierverhalten in   Ressourcen-Management-Klassen "- der Rat ist weniger spezifisch, aber nützlicher. Ich bin   nicht sicher, wie man es in eine Warnung dennoch dreht!

    
___ tag123compilerwarnings ___ Von einem Compiler ausgegebene Meldungen, die auf mögliche Probleme im Code oder in der Konfiguration hinweisen. ___ tag123g ___ g ++ ist das C ++ - Frontend für die GNU Compiler Collection (gcc). ___ tag123rule ofthree ___ Die Regel der Drei (auch bekannt als das Gesetz der Großen Drei oder Die Großen Drei) ist eine Faustregel in C ++, die behauptet, dass, wenn eine Klasse eine der folgenden definiert, sie wahrscheinlich alle drei explizit definieren sollte: Destruktor, Kopierkonstruktor, Zuweisungsoperator ___ qstntxt ___

Betrachten Sie das folgende Programm:

%Vor%

Dies wird, wenn es mit %code% auf GCC 4.7.1 kompiliert wurde, ausgespuckt:

%Vor%

Das ist normalerweise kein Problem, außer ein paar Dinge mit diesem Beispiel:

  1. Wenn ich den Konstruktor, die Zeigerdeklaration oder die Zeichenfolgedeklaration auskommentiere, wird die Warnung ausgeblendet. Das ist merkwürdig, weil man denkt, dass der Zeiger alleine ausreicht, aber nicht. Darüber hinaus bewirkt das Ändern der String-Deklaration in eine Integer-Deklaration, dass sie ebenfalls verschwindet, sodass sie nur dann angezeigt wird, wenn eine Zeichenfolge (oder wahrscheinlich andere auserlesene Klassen) darin enthalten ist. Warum verschwindet die Warnung unter diesen Umständen?

  2. Oft wird diese Warnung angezeigt, wenn der gesamte Zeiger auf eine vorhandene Variable zeigt (am häufigsten vom Betriebssystem verwaltet). Es gibt keine %code% und keine %code% . Wenn die Klasse mit dem Handle in diesen Fällen kopiert wird, möchte ich keine tiefe Kopie. Ich möchte, dass beide Handles auf dasselbe interne Objekt zeigen (z. B. ein Fenster). Gibt es eine Möglichkeit, dies dem Compiler zu ermöglichen, ohne den Kopierkonstruktor und den Zuweisungsoperator unnötig zu überlasten oder die Warnung vollständig mit %code% zu deaktivieren? Warum werde ich überhaupt belästigt, wenn die Dreiregel nicht einmal gilt?

___ answer11497579 ___
  1. Wenn Sie es tun, haben Sie eine POD-Struktur. Da es keine Konstruktoren haben kann, überprüft %code% nicht.

  2. Verwenden Sie ein Referenz- oder %code% -Objekt oder ein anderes Objekt, das einen Zeiger umschließt.

___
5
Antworten

C ++ Konstruktor + Zeigerobjekt kopieren

Ich versuche, "große drei" in C ++ zu lernen. Ich habe es geschafft, sehr einfaches Programm für "große drei" zu machen .. aber ich bin nicht sicher, wie man den Objektzeiger verwendet. Das folgende ist mein erstes Versuch. Ich habe Zweifel,...
18.09.2010, 05:07
2
Antworten

Understanding -Weffc ++

Betrachten Sie das folgende Programm: %Vor% Dies wird, wenn es mit -Weffc++ auf GCC 4.7.1 kompiliert wurde, ausgespuckt: %Vor% Das ist normalerweise kein Problem, außer ein paar Dinge mit diesem Beispiel: Wenn ich den Konstruktor...
16.07.2012, 00:50