2016-05-18 7 views
-2

Ich habe eine Klasse, und ich weiß, warum es zu kompilieren, schlägt fehl:Klasse Mitglied hat sein eigenes ständiges Mitglied, daher Konstruktor wird implizit gelöscht

// My class .hpp 
class MyClass 
{ 
public: 
    MyClass(); 
    MyClass(/*yet another constructor*/); 

private: 
    FOO::Dependancy dep_1; 
}; 

// Dependancy.hpp 
namespace FOO { 
    class Dependancy : public Parent 
    { 
    public: 
     Dependancy(const Bar& _bar); 
     ~Dependancy(); 

     virtual int method_1(/*bla*/); 
     virtual int method_1(/*bla bla*/);  

    private: 
     const Bar _bar; 
    }; 
} 

Wie Sie die Abhängigkeits Klasse const Mitglied sehen hat. Also, wenn kompiliert, (im Gegensatz zu g ++) Klirren ++ sagt mir genau, was mit dem Code falsch ist:

1. error: object of type 'MyClass' cannot be assigned because its copy assignment operator is implicitly deleted 
2. copy assignment operator of 'MyClass' is implicitly deleted because field 'dep_1' has a deleted copy assignment operator 
3. copy assignment operator of 'Dependancy' is implicitly deleted because field '_bar' has no copy assignment operator 

Meine Frage ist, wie das Problem zu lösen, wohl wissend, dass FOO::Dependancy und seine eigene Mitglieder (dh Bar) und so sind statische Bibliotheken, auf die ich keinen Zugriff auf ihren Quellcode habe. Mit anderen Worten, ich kann nichts gegen dieses konstante Mitglied tun, und ich muss das Problem in meiner eigenen Klasse lösen.

+3

Der von Ihnen angezeigte Code weist nicht das von Ihnen behauptete Problem auf. –

+0

Bevorzugen Sie die Initialisierung über die Zuweisung jedes Mal. Finde heraus, wie die Initialisierung von Klassenmitgliedern funktioniert. –

+0

@KerrekSB, ich habe meine Variablen buchstäblich umbenannt und meine Compiler-Ausgabe hier gepostet. Dies ist, was ich bekomme, um den Konstruktor meiner Klasse aufzurufen durch 'class_instance = MyClass (/ * noch ein Konstruktor * /);'. Warum schlägst du vor, dass mein Code kein Problem hat? – Pouya

Antwort

0

Die Fehler

object of type 'MyClass' cannot be assigned because its copy assignment operator is implicitly deleted

So ziemlich klar sind, wird die Kopie Zuordnung implizit gelöscht, müssen Sie selbst eine Beurteilung angeben/erstellen.

Der Grund, warum es gelöscht ist wegen dep_1, wie Sie aus dem zweiten Fehler

copy assignment operator of 'MyClass' is implicitly deleted because field 'dep_1' has a deleted copy assignment operator

Jetzt sehen können, wenn Sie wissen wollen, warum dep_1 keine Kopie Zuweisungsoperator hat, schauen der dritte Fehler:

copy assignment operator of 'Dependancy' is implicitly deleted because field '_bar' has no copy assignment operator

es läuft alles auf _bar vom Typ nach unten Bar keine Kopie Zuweisungsoperator hat, weil es als const definiert wurde.

Wie Sie gesagt haben, können Sie die Klasse Dependancy nicht ändern, so dass die einzige Lösung darin besteht, einen Kopierzuweisungsoperator in MyClass selbst zu erstellen.

+0

'_bar' hat keinen Kopierzuweisungsoperator, nicht weil er gelöscht wurde, sondern weil er' const' ist. – Quentin

+0

Danke für die Antwort und danke für die Zivilisation. Wie @Quentin bereits erwähnt hat _bar eine Kopie-Zuweisung. – Pouya

+0

@Quentin Interessant, danke für die Info :) – Rakete1111

Verwandte Themen