說有兩個類別,它們需要彼此:容器和項目。 類別容器創建類別項目的實例。類項目的每個實例持有類容器的一個實例,需要調用的唯一方法method_called_by_item類容器的。類集裝箱需要查看類項目的所有字段。兩個類別相互參照
問題是向前聲明:我希望有item.h內預先聲明,使類項目可以有容器的領域並調用該方法method_called_by_item。我怎麼做?
類集裝箱,它創建項目。
// 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
實施:
// 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
}
類項,這需要調用一個方法容器的:
// 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
實施:
// item.cpp
#include "item.h"
item::item(container * c){
this->c = c;
}
void item::do_something(){
this->c->method_called_by_item(this);
}
現在,如何在使用shared_ptr時調用析構函數,現在這些類相互引用了? – James
@詹姆斯你需要手動打破循環引用或適當使用'std :: weak_ptr'。 –
顯然我嘗試了weak_prt,發現沒有 - >運算符,所以我無法訪問任何成員函數。但我想清楚發生了什麼事。我做了更多的研究,發現我實際上應該使用標準指針來傳遞函數並保持對父類/子類的引用。一旦我這樣做了,析構函數就開始被調用。 – James