1

3つのヘッダーファイル間に3方向の循環依存関係があり、それぞれに1つのクラスがあります。これは、Agent2クラスの関連部分です。

#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とクラスに同等の関数が存在し、とを使用します。Agent3Agent1Agent2Agent3Agent3Agent1Agent2

Agent2明らかにクラスとのメンバーを使用する必要があるため、ここでは前方宣言が機能しないことを知っていますAgent3。このコードを使用する別のcppファイルでmain関数を実行すると、およびの未宣言の識別子エラーが発生しAgent1ますAgent3

可能な限り簡単な方法でこれを解決する方法を知っている人はいますか?

4

2 に答える 2

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;
}
于 2012-04-14T15:37:47.253 に答える
2

.cppヘッダーではなく、1 つ以上の関数の本体をファイルに移動する必要があります。このようにAgent1して、ヘッダーを必要とせずにヘッダーをAgent3含めることができます。Agent2Agent2

これらのクラスの 1 つの関数の実装を移動して循環依存関係を解消するだけで済みますが、3 つすべてが一貫しており、将来同様の問題が発生しないようにするために移動する必要がある場合があります。

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;
}
于 2012-04-14T15:38:15.480 に答える