2009-11-25 4 views
5

Beim Überprüfen einer unserer C++ - Klasse durch Coverity wurde eine Fehlermeldung zu einer bestimmten Klasse angezeigt. Die Klasse lautet wie folgt:Klassen-ID, die innerhalb der Klassendeklaration verwendet wird. Ist es eine gute Übung?

class InputRecord 
{ 
    /* Construtor */ 
    ... 
    InputRecord::RejectRecord(); 
    ... 
    /* Destructor */ 
} 

Welche Bedeutung hat die Verwendung eines Bezeichners innerhalb der Klasse? Ist es eine gute Übung, dem zu folgen?

Danke, Mathew Liju

Antwort

5

Auf gcc Compilern (v4.1 und höher) würde dies mit "error: extra qualification" nicht kompiliert werden. Es ist daher eine gute Übung, es nicht dort zu platzieren!

Siehe here, die die zusätzliche Qualifikation als nicht legale C++ diskutiert.

+0

nicht nur gcc, irgendein Compiler außer Visual Studio. –

0

G'day,

ich diese Art von Bezeichner immer gedacht, nur bei der Umsetzung verwendet wurde, und war in der Klassendefinition nicht erforderlich.

Eine Klassendeklaration ist

class InputRecord; 

Was du hast es eine Klassendefinition ist.

class InputRecord 
{ 
    /* Construtor */ 
    ... 
    RejectRecord(); 
    ... 
    /* Destructor */ 
} 

dann in Ihrer CPP-Datei Sie die Implementierung

InputRecord::RejectRecord() 
{ 
    ... 
} 
+0

Auch das ist mein Verständnis. Bevor ich eine Entscheidung über die Änderung des Programms treffe, möchte ich nur mein Verständnis bestätigen. Trotzdem danke für die Antwort :-) –

0

Im Allgemeinen haben, gibt es keine Fälle, in denen die Begriffsklärung durch die explizite InputRecord:: in Ihrem Codebeispiel vorgesehen sind wahrscheinlich etwas sein anders als redundant.

Wenn der Code komplexe Manipulationen ausführt, bei denen die spezifische Klasse relevant ist (z. B. wenn Sie ihn an eine Basisklasse mit einer schattierten Version übergeben), kann dies die Code-Klarheit unterstützen.

Es ist ein bisschen wie this-> (oder this. in C#/Java).

Persönlich würde ich solche redundante Spezifizierer entfernen und einen anderen Weg finden, den Punkt zu vermitteln.

+0

Eigentlich denke ich, dass sowohl C++ als auch Java Leute dazu zwingen sollten, dies für Membervariablen zu verwenden, also müssen wir sie nicht mehr mValue, m_value, m_Value, value_ etc nennen. –

+0

Wir müssen sie "m ..." nennen? : P Aus Sicht der Funktionalen Programmierung möchten Sie vor dem Verwenden des Zustands gewarnt werden./Von einer OO-Perspektive aus wäre es "normal". Für bestimmte Arten von Dingen würde das * wirklich * hässlich aussehen. Einige Programmierstandards sagen kein Präfix, wie es aus dem Code klar sein sollte, ob es ein Mitglied oder ein Parameter ist - was in Ordnung ist, wenn Sie richtigen Code schreiben. (Ich persönlich benutze keine ungarische Notation, sondern klammere mich an das Präfix [mit '_'], wissend, dass es falsch ist. Ich würde es verabscheuen, "dieses" überall voranstellen zu müssen). Ich denke, dies ist ein klarer Fall, in dem es keine OSFA-Lösung gibt. –

0

In der Klassendefinition verwende ich nur Klassenbezeichner, wenn ich Parameter habe, die ähnlich (oder gleich) für private Mitglieder der Klasse benannt sind. Es vermeidet Mehrdeutigkeiten und macht den Code gleichzeitig leichter lesbar. Ich kann mir keinen anderen Fall vorstellen, in dem du es benutzen müsstest.