2017-12-20 14 views
-2

Ich bin mir bewusst, dass dies oft gefragt wurde, aber ich habe nichts nützliches gefunden, um mein Problem zu lösen. Meine Header-Datei ist so etwas wie:Fehler - Keine übereinstimmende Funktion mit Klasse als Attribut C++

#include Myclass2.h 
class Myclass{ 
public: 
    Myclass2 instance; 
    ... 
    Myclass(Myclass2 instance, param1, ecc.); 

Während die Implementierungsdatei, unter anderen Dingen, nur den Konstruktor implementiert:

Myclass::Myclass(Myclass2 instance,...){ 
this->instance = instance; 

Grundsätzlich Ich mag das Instanz-Objekt aus der Klasse zugreifen , aber ich fürchte, das ist nicht der richtige Weg, denn es wird nicht mit Fehler kompilieren '' keine passende Funktion für Myclass2 :: Myclass2() und dann beschwert es sich, dass Myclass2 mehrere Argumente (wie es ist) und ich stelle es 0.

Aber ich konstruiere es nicht in der Klasse, ich möchte nur ein bereits erstelltes Objekt in den Konstruktor aufnehmen!

Irgendwelche Ideen, wie man den Fehler oder das Problem löst? Vielen Dank!

EDIT

class Myclass2{ 
public: 
    Myclass2(param1, param2, param3, param4); 
} 
+3

'Myclass :: Myclass (Myclass2-Instanz): instance (instance) {}'. Es wäre auch weniger verwirrend, wenn Sie dem Parameter einen anderen Namen als die Mitgliedsvariable geben. –

+0

Haben Sie versucht, die Konstruktorinitialisierungsliste zu verwenden? Löst das das Problem nicht? –

+0

Myclass :: Myclass (Myclass2 & instance, ...) kann es beheben. – lakeweb

Antwort

0

Wie andere in den Kommentaren gesagt, ist es wahrscheinlich kein Standardkonstruktor und Copy-Konstruktor für MyClass2 und Myclass. Wir sehen nicht den eigentlichen Code, aber ich denke, dass dieses Beispiel helfen würde:

class Myclass2 { 
public: 
    Myclass2() = default; 
    Myclass2(int const& x) : x(x) {} 
    Myclass2(Myclass2 const& myclass2) : Myclass2(myclass2.x) {} 

    int x; 
}; 

class Myclass{ 
public: 
    Myclass() : instance() {} 
    Myclass(Myclass2 const& instance) : instance(instance) {} 
    Myclass(Myclass const& myclass) : Myclass(myclass.instance) {} 

    Myclass2 instance; 
}; 

In einigen Fällen sind die explizit erzeugt Standardkonstruktoren deaktiviert sind (wie wenn wir unsere eigenen Konstrukteure erklären, weitere Informationen http://en.cppreference.com/w/cpp/language/default_constructor), so dass wir Ich muss sie nochmal schreiben. Wir müssen Konstruktor Myclass2() : ... so können wir zum Beispiel Myclass2 myclass; initialisieren wie Standard Wenn alle Mitglieder der Klasse Standard konstruierbar sind, können wir lassen Sie es automatisch, indem er erklärt Myclass2() = default;(C++ 11)

Die Linie erzeugt werden in Ihr Code this->instance = instance; scheint etwas zu sein in der Element-Initialisierungsliste - es initialisiert Mitglieder sogar "vor" dem Konstruktor, so dass Sie konstante Mitglieder haben können, die Sie sonst nicht initialisieren könnten. Die Syntax ist:

Myclass(Myclass2 instance) : instance(instance) { 
// the rest of constructor, where you can do what you want with already initialized instance 
} 

Sorgen Sie sich nicht um die instance(instance) Syntax, erkennt es, was was ist (auch wenn einige Leute denken, die gleichen Namen ein wenig verwirrend sind). Auch wenn andere darauf hinweisen, dass Sie keine Myclass2-Instanz als Referenz verwenden, erstellen Sie eine temporäre Kopie und es gibt keinen Kopierkonstruktor für Myclass2.

Copy-Konstruktor (für Myclass, die das mit Myclass const& instance Argument nur wäre) ist das, was wir verwenden, wenn wir Klasse wie Myclass myclass(otherMyclass); initialisieren möchten.

Es ist ziemlich üblich, Konstruktoren zum Beispiel durch Myclass(something) : Myclass() {} zu delegieren.

(Informationen darüber, wann Sie erstellen müssen, welche davon auf http://en.cppreference.com/w/ verfügbar sind)

Manchmal auch benötigen wir Kopie Zuweisungsoperator (http://en.cppreference.com/w/cpp/language/copy_assignment) zu schaffen, so dass wir wie die Dinge tun:

Myclass m1; 
Myclass m2; 
m2 = m1; 

aber die explizite ist wahrscheinlich genug, wenn Sie nicht unbedingt What is The Rule of Three? und What is the Rule of Four (and a half)? lesen möchten.

+0

danke! Ich verstehe, dass die Frage nicht den Richtlinien entspricht, aber dennoch hat das das Problem gelöst, und ich habe warum verstanden! –

Verwandte Themen