Перекрестные ссылки включали заголовки в программе C ++ - PullRequest
21 голосов
/ 16 сентября 2009

Мне любопытно, какой сценарий настроен, как в следующем примере:

Вот код, который будет помещен в файл с именем Header1.h:

#ifndef HEADER1_H
#define HEADER1_H

#include "Header2.h"

class Class1
{
 Class2 class2Instance;
};

#endif

Вот код, который будет помещен в файл с именем Header2.h:

#ifndef HEADER2_H
#define HEADER2_H

#include "Header1.h"

class Class2
{
 Class1 class1Instance;
};

#endif

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

Ответы [ 5 ]

32 голосов
/ 16 сентября 2009

Проблема в том, что размер Class1 зависит от Class2, и наоборот. Следовательно, нет способа рассчитать размер для любого из них. Объявите вперед один из классов и измените один из атрибутов на указатель или ссылку:

#ifndef HEADER2_H
#define HEADER2_H

class Class1;
class Class2
{
 Class1 *class1Instance;
 // or
 Class1 &class1Instance;
};

#endif
8 голосов
/ 31 августа 2012

Файл: header1.h

#ifndef HEADER1_H
#define HEADER1_H

class Class2; // no need to include Header2

class Class1
{
    Class2* class2Instance;
}

#endif

Файл: header1.cpp

#include "header2.h" // do include Header2 here, otherwise you will get errors

адаптировано с здесь

3 голосов
/ 16 сентября 2009

Две структуры бесконечно повторяются друг за другом - чтобы узнать размер Class1, вам нужно знать размер Class2, для которого требуется размер Class1 и т. Д. Обходным путем для этого является использование указатель хотя бы в одном из случаев:

#ifndef HEADER1_H
#define HEADER1_H

class Class2; // no need to include Header2

class Class1
{
    Class2* class2Instance;
}

#endif
2 голосов
/ 16 сентября 2009

Нельзя, чтобы Class2 содержал экземпляр Class1, и чтобы Class1 содержал экземпляр Class2. Что вы можете сделать, так это чтобы каждый класс содержал ссылку или указатель на экземпляр другого типа (с соответствующими прямыми ссылками). т.е.


class Class2;
class Class1
{
    Class2& class2Instance;
};

class Class1;

class Class2
{
    Class1& class1Instance;
};
1 голос
/ 16 сентября 2009

То, что у вас есть, - это классическая круговая ссылка. Это уже обсуждалось здесь, на переполнении стека. Просто примените принятый ответ к этой теме, заменив "struct" на "class", и все будет прекрасно

Отредактировано для ясности

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