2012-04-14 88 views
1

我在三個頭文件之間存在三種循環依賴關係,每個頭文件中都有一個類。這是Agent2類的相關部分:存在於Agent1Agent3循環相關性問題

#ifndef BUYINGJEANS1_H 
#define BUYINGJEANS1_H 
class Agent2{ 
    public: 
    Agent2(){} 

    double getAdvertisingFash(int currentTime, int sFash, int brand){ 
     Agent1 agent1; 
     Agent3 agent3; 
     double probabilityOfChangingFashion = (exp((-advertisementArray[currentTime+1][brand]*pow(abs(min(fashionArray[brand]+1,4.0)-sFash),D))+(-alphaArray[2][2]*pow(abs(fashionArray[brand]-sFash),AArray[2][2]))) * (exp((-(agent1.alphaArray[2][1])*pow(abs((agent1.fashionArray[brand])-sFash),AArray[2][1]))))*(exp((-(agent3.alphaArray[2][3])*pow(abs((agent3.fashionArray[brand])-sFash),AArray[2][3])))))/getZScoreAdvertisingFash(currentTime,brand); 
     return probabilityOfChangingFashion; 
    } 
#endif 

的等效功能,除了Agent1將使用Agent2Agent3,和Agent3將使用Agent1Agent2

我知道前向聲明在這裏不起作用,因爲我顯然需要使用類Agent2Agent3的成員。當我在使用此代碼的單獨cpp文件中運行主函數時,我收到Agent1Agent3的未聲明標識符錯誤。

任何人都知道我可以在可能的最簡單的方式解決呢?

回答

2

您將需要移動身體的一個或多個你的函數的成.cpp文件,而不是頭部。這樣一來,Agent1Agent3可以包括Agent2頭沒有Agent2頭需要他們。

你只需要移動的這些類的一個功能,打破循環依賴執行,但你可能想這樣做,所有三個是一致的,並避免今後發生類似的問題。

在Agent2.H:

#ifndef BUYINGJEANS1_H 
#define BUYINGJEANS1_H 
class Agent2{ 
    public: 
    Agent2(){} 

    double getAdvertisingFash(int currentTime, int sFash, int brand); 
} 
#endif 

而且在Agent2.cpp:

#include "Agent2.H" 

#include "Agent1.H" 
#include "Agent3.H" 
double Agent2::getAdvertisingFash(int currentTime, int sFash, int brand) 
{ 
    Agent1 agent1; 
    Agent3 agent3; 
    double probabilityOfChangingFashion = (exp((-advertisementArray[currentTime+1][brand]*pow(abs(min(fashionArray[brand]+1,4.0)-sFash),D))+(-alphaArray[2][2]*pow(abs(fashionArray[brand]-sFash),AArray[2][2]))) * (exp((-(agent1.alphaArray[2][1])*pow(abs((agent1.fashionArray[brand])-sFash),AArray[2][1]))))*(exp((-(agent3.alphaArray[2][3])*pow(abs((agent3.fashionArray[brand])-sFash),AArray[2][3])))))/getZScoreAdvertisingFash(currentTime,brand); 
    return probabilityOfChangingFashion; 
} 
2

移動構件函數定義以分離cpp文件和包含頭那裏。

事情是這樣的:

#include "agent2.hpp" 

double Agent2::getAdvertisingFash(int currentTime, int sFash, int brand){ 
    Agent1 agent1; 
    Agent3 agent3; 
    double probabilityOfChangingFashion = (exp((-advertisementArray[currentTime+1][brand]*pow(abs(min(fashionArray[brand]+1,4.0)-sFash),D))+(-alphaArray[2][2]*pow(abs(fashionArray[brand]-sFash),AArray[2][2]))) * (exp((-(agent1.alphaArray[2][1])*pow(abs((agent1.fashionArray[brand])-sFash),AArray[2][1]))))*(exp((-(agent3.alphaArray[2][3])*pow(abs((agent3.fashionArray[brand])-sFash),AArray[2][3])))))/getZScoreAdvertisingFash(currentTime,brand); 
    return probabilityOfChangingFashion; 
}