Проблема включения - PullRequest
       21

Проблема включения

3 голосов
/ 05 августа 2010

У меня есть шаблон включения следующим образом:

/*
 * Class1.h
 */

#ifndef CLASS1_H_
#define CLASS1_H_

#include "Class2.h"

namespace Class1_namespace
{

class Class1
{
  Class2* Class2_ptr;
  void Class1_member()
  {
      (*Class2_ptr).Class2_method();
  }
};

}

#endif /* CLASS1_H_ */

/*
 * Class2.h
 */

#ifndef CLASS2_H_
#define CLASS2_H_

#include "Class1.h"

class Class2
{
    Class1_namespace::Class1 Class2_data;

public:
    void Class2_method(){};
};

#endif /* CLASS2_H_ */

/*
 * main.cpp
 */

#include "Class1.h"

int main()
{
    return 0;
}

Однако это приводит к ошибке «Class1_namespace» не называет тип ».

Эта ошибка вызвана упорядочением моих включений?

Какие есть возможные решения? Я сомневаюсь в предварительных декларациях, решающих мою проблему.

Ответы [ 2 ]

2 голосов
/ 05 августа 2010

Class1 не должен включать Class2.

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

Например, предположим, что Class1 выглядел следующим образом

#include "Class2.h"

namespace Class1_namespace
{

    class Class1
    {
        Class2* class2;
    };

}

Если вы думаете, что вам нужно включить, вы можете вместо этого сделать это:

class Class2;

namespace Class1_namespace
{

    class Class1
    {
        Class2* class2;
    };

}

нарушить взаимное включение.

0 голосов
/ 05 августа 2010

В class1.h, попробуйте удалить ненужный и циклический #include of class2.h. Если требуется циклическая зависимость - или даже если нет - рассмотрите возможность использования предварительных объявлений.

...