2

我正在尝试设置一个模拟程序。模拟运行了多个步骤,模拟类应该调用一堆不同类的 ::step(),其中一个是 _experiment 类。

我无法让它工作,因为实验类需要模拟类,而模拟类需要知道实验类是什么,所以它们是循环依赖的。我已经尝试通过使用前向声明来解决它,但是我无法访问前向声明类的方法。那么,前向声明的意义何在?谁能帮我?谢谢!

主文件

int main()
{
    _experiment experiment;
}

实验.cpp:

#include "experiment.h"

_experiment::experiment()
{
    _simulation simulation;
    simulation.experiment = this;
    simulation.start();
}

void _experiment::step()
{
    //Apply forces to simulation
}

实验.h:

#include "simulation.h"

class _experiment {
public:
    void step()
};

模拟.cpp:

#include "simulation.h"

void _simulation::run()
{
    //Run simulation for 1000 steps
    for(int i = 0; i < 1000; i++)
    {
        experiment->step() //Calculate forces. Doesnt work (cant use member functions of forward declared classes. How to work around this?

        //Calculate motion
    }
}

模拟.h:

class _experiment; //Forward declaration

class _simulation {
public:
     _experiment* experiment
     void run();
};
4

2 回答 2

0

您没有_experiment在simulation.cpp 中的定义,在源文件中包含experiment.h 文件,一切都应该可以工作。

此外,您的示例_experiment中似乎没有使用该类_simulation,因此无需在experiment.h 中包含simulation.h。还将包含保护添加到您的头文件中。

于 2011-12-13T15:24:36.733 回答
0

experiment.h不需要 includesimulation.h或 forward declare _simulation,因为_experiment根本不依赖于的定义_simulation

您已经有一个前向声明或_experimentin simulation.h,这很好,因为 的定义_simulation包含指向 的指针_experiment,因此不需要完整的定义。

缺少的是源文件中两个类的定义。包括来自两个源文件的两个头文件,因为它们确实需要类定义,并且一切都应该很好。

一般来说,如果你在源文件中包含所有你需要的头文件,并且当你需要的不仅仅是前向声明时,只包含来自另一个头文件的头文件,那么你将主要避免循环依赖问题。

您还需要将包含保护添加到标头中,以避免在确实需要包含其他标头的标头时出现多个定义。

那么,前向声明的意义何在?

它允许您声明一个类存在,而无需声明该类所依赖的任何其他内容。您可以做一些有用的事情,例如定义类的指针或引用,或者使用类作为参数或返回类型声明函数,只使用前向声明。你不能做任何需要知道班级规模或成员的事情。

于 2011-12-13T15:25:29.420 回答