我正在使用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
那是怎么回事?
答案 0 :(得分:9)
#if !defined __CASCADE_DISPLAY_H__
#define __CASCADE_DISPAY_H__
第二行应该是:
#define __CASCADE_DISPLAY_H__
同样:
#if !defined __BASE_STACK_DISPLAY_H__
#define __BASE_STACK_DISPAY_H__
此外,包含双下划线的名称是为实现保留的,不允许在自己的代码中创建此类名称。对于以单个下划线和大写字母开头的名称也是如此。
答案 1 :(得分:4)
你的警卫中有一个拼写错误
#if !defined __CASCADE_DISPLAY_H__ <--- here you have DISPLAY
#define __CASCADE_DISPAY_H__ <--- here you have DISPAY (no L!)
是的,避免使用此类名称的双下划线
答案 2 :(得分:3)
#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);
}
};
}
我相信这个解决方案通常优于前向声明,因为你消除了超类和子类之间的一些紧密耦合,并且除此之外还创建了一个更通用的接口。这使您可以在StackDisplay.h中消除CascadeDisplay.h的#include
。