Вызов метода-члена циклически зависимых классов - PullRequest
2 голосов
/ 13 декабря 2011

Я пытаюсь настроить программу моделирования.Симуляция выполняется за несколько шагов, и класс симуляции должен вызывать :: step () для группы разных классов, одним из которых является класс _experiment.

Я не могу заставить это работать, потому что экспериментальному классу нужен класс симуляции, а классу симуляции нужно знать, что такое экспериментальный класс, поэтому они зависят от циклического режима.Я попытался решить ее с помощью предварительного объявления, но затем я не могу получить доступ к методам объявленного вперед класса.Какой смысл в декларации вперед?Может кто-нибудь мне помочь?Спасибо!

main.cpp

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
    }
}

simulation.h:

class _experiment; //Forward declaration

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

Ответы [ 2 ]

0 голосов
/ 13 декабря 2011

experiment.h необязательно включать simulation.h или форвард объявить _simulation, поскольку определение _experiment не зависит от _simulation вообще.

У вас уже есть предварительное объявление или _experiment в simulation.h, что хорошо, поскольку определение _simulation содержит указатель на _experiment, поэтому полное определение не требуется.

Чего не хватает, так это определения обоих классов в исходных файлах. Включите оба заголовка из обоих исходных файлов, поскольку им нужны определения классов, и все должно быть хорошо.

В общем, если вы включите все заголовки, которые вам нужны, в исходные файлы и включите заголовок из другого заголовка только тогда, когда вам нужно больше, чем предварительное объявление, то вы в основном избежите проблем с циклической зависимостью.

Вам также необходимо добавить защитные заголовки для заголовков, чтобы избежать нескольких определений в тех случаях, когда вам нужно включать заголовки из других заголовков.

Какой тогда смысл объявления форварда?

Это позволяет вам объявить, что класс существует, без необходимости объявлять что-либо еще, от чего зависит класс. Вы можете сделать несколько полезных вещей, таких как определить указатели или ссылки на класс, или объявить функции с классом в качестве аргумента или возвращаемого типа, используя только предварительное объявление. Вы просто не можете делать ничего, что требует знания размера или членов класса.

0 голосов
/ 13 декабря 2011

У вас нет определения _experiment в Simulation.cpp, включите файл эксперимента.h в исходный файл, и все должно работать.

Кроме того, класс _experiment не работаетпохоже, что в вашем примере используется _simulation, поэтому нет необходимости включать,6Также добавьте включите охрану в заголовочные файлы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...