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和类中存在等效函数Agent3,除了Agent1会使用Agent2andAgent3Agent3会使用Agent1and Agent2

我知道前向声明在这里不起作用,因为我显然需要使用类的成员Agent2Agent3. 当我在使用此代码的单独 cpp 文件中运行 main 函数时,我收到一个未声明的标识符错误 for Agent1and 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文件而不是标题中。这样,Agent1可以Agent3包含Agent2标题而不需要Agent2标题。

您只需要移动其中一个类的函数的实现即可打破循环依赖关系,但您可能希望这样做以使所有三个类保持一致并避免将来出现类似问题。

在代理 2.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 回答