2016-06-19 11 views
1

ich diesen class.h habe:Clarify über Funktionskörper/C++

class CItemPriceListTableCache: public cache<TItemPriceListTable> 
{ 
public: 
    virtual ~CItemPriceListTableCache();  
}; 

Und ich habe diesen class.cpp:

CItemPriceListTableCache::~CItemPriceListTableCache() 
{ 

} 

Jetzt Fragen kommen: Warum ist ~CItemPriceListTableCache funtion Körper leer? Wenn ich von class.cpp löschen, sollte die ~CItemPriceListTableCache in Ordnung sein? Wird dies meine Codes beeinflussen? Womit soll ich Funktionskörper ersetzen? Ich mag es einfach nicht, leere Funktionen zu sehen. Selbst wenn ich eine Zeile in Funktion habe, ist es ok für mich, ich mag einfach nicht, dass die Funktion leer ist. Wenn ich vollständig lösche virtuelle Deklaration von Destruktor aus der Klasse sollte in Ordnung sein?

EDIT 1: Entfernt nutzlos txt aus Frage.

EDIT 2: class.h

class DH2KeyAgreement: public KeyAgreement 
{ 
public: 
    DH2KeyAgreement(); 
}; 

class.cpp

DH2KeyAgreement::DH2KeyAgreement() : dh_(), dh2_(dh_) 
{ 

} 

Wie ich die default hier verwendet werden soll?

Sollte das gut so sein?

class DH2KeyAgreement: public KeyAgreement 
{ 
public: 
    DH2KeyAgreement():dh_(), dh2_(dh_)=default; 
}; 
+1

Was ist 'Cache '? –

+0

EDITED HAUPTfrage @ πάνταῥεῖ – Smartx221

+0

http://stackoverflow.com/questions/461203/when-to-use-virtual-destructors –

Antwort

4

Warum ist ~CItemPriceListTableCache funtion Körper leer?

Da keine spezielle Aktion zur Zerstörung durchgeführt werden muss, sollte der Destruktor dennoch für diese Klasse aufrufbar sein.

Wenn ich aus class.cpp lösche sollte der ~ CItemPriceListTableCache in Ordnung sein? Wird dies meine Codes beeinflussen?

Ja, Sie werden einen undefinierten Referenzfehler haben.

Mit was soll ich ersetzen ~ CItemPriceListTableCache Funktion Körper? Ich mag es einfach nicht, leere Funktionen zu sehen. Selbst wenn ich eine Zeile in Funktion habe, ist es ok für mich, ich mag einfach nicht, dass die Funktion leer ist.

Sie können

virtual ~CItemPriceListTableCache() {} 

oder

virtual ~CItemPriceListTableCache() = default; 

in der Klassendeklaration schreiben.

Wenn ich lösche virtuelle Deklaration von Destruktor aus der Klasse sollte in Ordnung sein?

Ja, der Standard-Destruktor, der vom Compiler generiert wird, ist in Ordnung.

+1

Wenn die Basisklasse einen virtuellen Destruktor hat, ist es nicht notwendig, einen leeren virtuellen Destruktor in den abgeleiteten zu schreiben Klasse. Der vom Compiler erzeugte Destruktor wird virtuell sein. –

+0

@PeteBecker Ja, guter Punkt. –

+0

@ πάνταῥεῖ Ich habe Frage bearbeitet, um eine andere zu vermeiden .. Ca du guckst? – Smartx221

0

Wenn für eine Klasse kein Destruktor definiert ist, wird der Standarddestruktor verwendet. Aber was passiert, wenn eine Klasse zum Beispiel einen Konstruktor als virtuell deklariert hat, werden einige Compiler wie zB Virtual constructor seen, but no virtual destructor warnen und es ist wichtig, dass Sie immer sicherstellen, dass beim Kompilieren des Codes keine Warnungen schweben virtueller Destruktor und lassen Sie den Körper leer, nur um die Warnungen zu beseitigen (In diesem Fall führt virtueller Destruktor den gleichen Job wie der Standardkonstruktor, außer dass es virtual deklariert wird). Es tut nicht weh, es da drin zu behalten, noch eines Tages wirst du es brauchen.

Versuchen Sie, sie zu entfernen und neu zu kompilieren, um zu sehen, ob irgendwelche Warnungen angezeigt werden, wenn es keine Warnungen gibt, dann können Sie sie alle zusammen entfernen (aber viel Glück mit Ihrem Compiler, weil ein guter Compiler Sie in diesem Fall gewarnt haben sollte)