2016-04-26 15 views
0

Ich habe im Wesentlichen ein zyklisches Abhängigkeitsproblem, bei dem eine Funktion ein Objektobjekt verwendet und das Objekt diese Funktion verwendet. Gibt es eine Möglichkeit, dies zu lösen, ohne daran herumzuarbeiten?Funktion verwendet Objekt und Objekt verwendet Funktion

//function that uses struct 
void change_weight(Potato* potato,float byX) { potato->weight+=byX; } 
//said struct that uses said function 
struct Potato 
{ 
    float weight=0.0; 
    Potato(float weightin) { change_weight(weightin); } 
}; 

Bitte beachte, dass ich dieses Beispiel zu verstehen ist albern, aber dieses Beispiel enthält nur den „Kern des Problems“, die in vielen komplexeren Situationen gekommen ist, wo ich würde manchmal nicht weiß, wie ich um es funktionieren würde oder auch wenn es umgangen werden könnte, und es wäre sehr praktisch, es einfach tun zu können. Ich frage, ob es eine Möglichkeit gibt, dies zu tun ohne um es zu arbeiten.

+2

Sie müssen nur aufgespalten Ihre Deklarationen und Implementierungen zwischen den üblichen .h und .cpp Dateien. – Quentin

+0

Während der Code nur ein Beispiel ist, ist es ein ziemlich schlechtes ... :) Die Funktion würde besser als Member-Funktion passen. –

+0

@JoachimPileborg In der Antwort: "Beachten Sie, dass ich dieses Beispiel verstehe, ist albern, aber dieses Beispiel enthält nur die" Essenz des Problems ", die in viel komplexeren Situationen aufgetreten ist, wo ich manchmal nicht wusste, wie ich es umgehen würde oder auch wenn es umgangen werden könnte " –

Antwort

3

Nur erklären der Konstruktor in der Strukturdefinition, dann die Definition bewegen die Struktur aus und legen Sie sie zusammen mit der Funktion, unter die Strukturdefinition:

struct Potato 
{ 
    float weight=0.0; 
    Potato(float weightin); // Only declare constructor 
} 

//function that uses struct 
void change_weight(Potato potato,float byX) { potato.weight+=byX; } 

// Define the constructor 
Potato::Potato(float weightin) { change_weight(*this, weightin); } 
+2

Die Frage ist beantwortet, aber beachte, dass der Code nicht kompiliert: Der Aufruf von' change_weight' fehlt ein Parameter. Darüber hinaus wird "Kartoffel" wertmäßig weitergegeben. – Quentin

+0

@Quentin Ich habe bearbeitet, um ein Semikolon am Ende hinzuzufügen und änderte den Durchlauf nach Wert, um als Referenz in sowohl meine Frage und diese Antwort zu übergeben (Ich testete es auf Ideone [hier] (http://ideone.com/rdCMO5)) –