2013-05-25 76 views
5

說有兩個類別,它們需要彼此:容器項目。 類別容器創建類別項目的實例。類項目的每個實例持有類容器的一個實例,需要調用的唯一方法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); 
} 

回答

3

您已經添加了前向聲明item.h因此,您只需將以下行添加到item.cpp即可。

#include "container.h" 

container.h已經包括item.h讓你不進行任何額外的變化,但作爲Mahmoud Fayez指出,你可以有添加前向聲明爲好。這將消除通常需要的頭文件的依賴性 - 它可以減少大型項目的構建時間,並允許頭文件「獨立運行」。

+0

現在,如何在使用shared_ptr時調用析構函數,現在這些類相互引用了? – James

+0

@詹姆斯你需要手動打破循環引用或適當使用'std :: weak_ptr'。 –

+0

顯然我嘗試了weak_prt,發現沒有 - >運算符,所以我無法訪問任何成員函數。但我想清楚發生了什麼事。我做了更多的研究,發現我實際上應該使用標準指針來傳遞函數並保持對父類/子類的引用。一旦我這樣做了,析構函數就開始被調用。 – James

7

在container.h

class item; // do not include the item.h 

在container.cpp

#include "item.h" 

在item.h

class container; // do not include container.h 

在item.cpp

#include "container.h"