Angenommen, es gibt zwei Klassen, die sich gegenseitig benötigen: Container und Element. Die Klasse Container erstellt Instanzen der Klasse Element. Jede Instanz der Klasse Artikel hält eine Instanz der Klasse Behälter und nur die Methode method_called_by_item der Klasse Container aufrufen muss. Klasse Container muss alle Felder der Klasse Element sehen.zwei Klassen, die sich gegenseitig referenzieren
Das Problem ist die Vorwärts-Erklärung: Ich habe eine Vorwärts-Erklärung innerhalb von item.h haben wollen, so dass die Klasse Artikel einen Behälter als Feld haben kann und rufen Sie die Methode method_called_by_item. Wie mache ich das?
Klasse Container, die Elemente erstellt.
// container.h
#ifndef CONTAINER_H
#define CONTAINER_H
#include "item.h"
class container{
public:
item * create_item();
void method_called_by_item(item * i);
};
#endif //CONTAINER_H
Die Umsetzung:
// container.cpp
#include "container.h"
item * container::create_item(){
return new item(this);
}
void container::method_called_by_item(item * i){
// do stuff with item
}
Die Klasse Artikel, die ein Verfahren zum Container aufrufen muss:
// item.h
#ifndef ITEM_H
#define ITEM_H
#include <iostream>
class container;
class item{
public:
item(container * c);
void do_something();
container * c;
};
#endif //ITEM_H
Die Umsetzung:
// item.cpp
#include "item.h"
item::item(container * c){
this->c = c;
}
void item::do_something(){
this->c->method_called_by_item(this);
}
Wie erhalten Sie nun die Destruktoren, die bei der Verwendung von shared_ptr aufgerufen werden, da sich diese Klassen jetzt gegenseitig referenzieren? – James
@James müssen Sie entweder den Zirkelverweis manuell brechen oder 'std :: weak_ptr' verwenden. –
Offensichtlich versuchte ich weak_prt und entdeckte, dass es keinen -> Operator gab, so dass ich auf keine Mitgliedsfunktionen zugreifen konnte. Aber ich habe herausgefunden, was passiert ist. Ich forschte weiter und entdeckte, dass ich tatsächlich Standardzeiger verwenden sollte, um in Funktionen zu übergehen und Verweise auf Eltern/Kind-Klassen beizubehalten. Sobald ich das getan hatte, wurden die Destruktoren angerufen. – James