Циркулярные ссылки на C ++ в разных файлах - PullRequest
2 голосов
/ 22 июня 2011

Если я хочу циклическую ссылку, но в двух разных файлах на C ++, как бы я это реализовал?

Например

AUnit.h

#inclue <BUnit.h>
class AClass : public TObject
{

   __published
        BClass * B;
};

BUnit.h

#include <AUnit.h>
class BClass : public TObject
{
    __published
        AClass *A;     
};

Я не могу сделать это только в одном файле с предварительными декларациями.

Ответы [ 2 ]

6 голосов
/ 22 июня 2011

Вы также можете использовать предварительную декларацию в этом случае:

// AUnit.h
class BClass;
class AClass : public TObject
{

   __published
        BClass * B;
};

// BUnit.h
#include <AUnit.h>
class BClass : public TObject
{
    __published
        AClass *A;     
};

Нет никакой разницы в сценарии, если они оба находятся в одном файле, потому что #include ничего не делает, кроме вставки включенного файла (это действительно просто замена текста). Это точно так же. После предварительной обработки BUnit.h, выше будет выглядеть так:

class BClass;

class AClass : public TObject
{

   __published
        BClass * B;
};

class BClass : public TObject
{
    __published
        AClass *A;     
};
2 голосов
/ 22 июня 2011

Я полагаю, вы говорите о циклических зависимостях .

Ответ действительно заключается в использовании предварительного объявления, такого как:

AUnit.h

#include <BUnit.h>
class AClass : public TObject
{
   BClass *B;
};

BUnit.h

class AClass;  // Forward declaration

class BClass : public TObject
{
   AClass *A;
};

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

...