Почему я получаю "слишком много включаемых файлов: глубина = 1024"? - PullRequest
2 голосов
/ 13 марта 2010

Я использую Visual Studio 2008 Express, и постоянно получаю следующую ошибку:

"Cascadedisplay.h(4) : fatal error C1014: too many include files : depth = 1024.

Очевидно, что я делаю что-то очень неправильное с включаемыми файлами, но я просто не вижу, что.

По сути, у меня есть класс интерфейса StackDisplay, из которого я хочу получить CascadeDisplay в другом файле:

#if !defined __BASE_STACK_DISPLAY_H__
#define __BASE_STACK_DISPAY_H__

#include <boost\shared_ptr.hpp>
#include "CascadeDisplay.h"

namespace Sol
{
    class StackDisplay
    {
        public:
            virtual ~StackDisplay();
            static boost::shared_ptr<StackDisplay>
            make_cascade_display(boost::shared_ptr<int> csptr)
            {
                return boost::shared_ptr<StackDisplay>(new CascadeDisplay(csptr));
            }
    };
}
#endif

, а затем в CascadeDisplay.h:

#if !defined __CASCADE_DISPLAY_H__
#define __CASCADE_DISPAY_H__

#include "StackDisplay.h"
#include <boost\shared_ptr.hpp>

namespace Sol
{
    class CascadeDisplay: public StackDisplay
    {
        public:
            CascadeDisplay(boost::shared_ptr<int> csptr){};
    };
}

#endif

Так что с этим?

Ответы [ 3 ]

9 голосов
/ 13 марта 2010
#if !defined __CASCADE_DISPLAY_H__
#define __CASCADE_DISPAY_H__

Вторая строка должна быть:

#define __CASCADE_DISPLAY_H__

То же самое с:

#if !defined __BASE_STACK_DISPLAY_H__
#define __BASE_STACK_DISPAY_H__

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

4 голосов
/ 13 марта 2010

В ваших стражах есть опечатка

#if !defined __CASCADE_DISPLAY_H__     <--- here you have DISPLAY
#define __CASCADE_DISPAY_H__           <--- here you have DISPAY (no L!)

и да, избегайте двойных подчеркиваний в таких именах

3 голосов
/ 13 марта 2010

Законен ли #if !defined...? Я всегда использовал #ifndef.

В любом случае, почему ваш "базовый" класс требует ссылку на CascadeDisplay? Это не кажется правильным. Попробуйте заменить вызов для создания новой CascadeDisplay на вызов чисто виртуальной функции в StackDisplay, которую ваш подкласс должен реализовать соответствующим образом.

IE, что-то вроде (и простите, у меня нет под рукой компилятора c ++, чтобы это проверить):

namespace Sol
{
    class StackDisplay
    {
        public:
            virtual ~StackDisplay();
            boost::shared_ptr<StackDisplay>
            make_cascade_display(boost::shared_ptr<int> csptr)
            {
                return make_display(csptr);
            }

        protected:
            virtual boost::shared_ptr<StackDisplay> make_display(boost::shared_ptr<int> csptr) = 0;
    };

    class CascadeDisplay: public StackDisplay
    {
        public:
            CascadeDisplay(boost::shared_ptr<int> csptr){};

        protected:
            virtual boost::shared_ptr<StackDisplay> make_display(boost::shared_ptr<int> csptr)
            {
                return new CascadeDisplay(csptr);
            }
    };
}

Я считаю, что это решение в целом превосходит предварительное объявление, потому что вы устраняете некоторую тесную связь между вашим суперклассом и вашим подклассом и, кроме того, делаете более общий интерфейс. Это позволяет исключить #include файла CascadeDisplay.h в StackDisplay.h.

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