VC++ 在两个文件互相包含时会出现的错误

首先,要分别在两个文件中实现以下两个类

class Object

{

public:

NewType ToType();

};

class NewType : public Object

{

}

--------------------------------------------------------------------------------    做法1  ---------------------------------------------------------

//在文件Object.h 中定义

#include "NewType.h"

class Object

{

public:

NewType ToType();

};

//在文件NewType.h 中定义

#include "Object.h"

class NewType : public Object

{

}

将产生错误:

"warning C4182: #include nesting level is 363 deep; possible infinite recursion"

"fatal error C1076: compiler limit : internal heap limit reached; use /Zm to specify a higher limit"

原因是两个文件互相包含,导致包含的层次太深

--------------------------------------------------------------------------------    做法2  ---------------------------------------------------------

//在文件Object.h 中定义

#include "NewType.h"

#ifndef _OBJECT_H

#define _OBJECT_H

class Object

{

public:

NewType ToType();

};

#endif

//在文件NewType.h 中定义

#include "Object.h"

#ifndef _NEWTYPE_H

#define _NEWTYPE_H

class NewType : public Object

{

}

#endif

错误依旧

--------------------------------------------------------------------------------    做法3  ---------------------------------------------------------

//在文件Object.h 中定义

#ifndef _OBJECT_H

#define _OBJECT_H

#include "NewType.h"

class Object

{

public:

NewType ToType();

};

#endif

//在文件NewType.h 中定义

#include "Object.h"

#ifndef _NEWTYPE_H

#define _NEWTYPE_H

class NewType : public Object

{

}

#endif

产生错误:

"error C2504: ‘Object‘ : base class undefined"

--------------------------------------------------------------------------------    做法4  ---------------------------------------------------------

//在文件Object.h 中定义

#include "NewType.h"

#ifndef _OBJECT_H

#define _OBJECT_H

//位置

class Object

{

public:

NewType ToType();

};

#endif

//在文件NewType.h 中定义

#ifndef _NEWTYPE_H

#define _NEWTYPE_H

#include "Object.h"

class NewType : public Object

{

}

#endif

产生错误:

"error C2146: syntax error : missing ‘;‘ before identifier ‘ToType‘"

"error C2501: ‘NewType‘ : missing storage-class or type specifiers"

原因是不能识别NewType类

 

 

解决方案:

于是在"位置"加上前向引用声明

class NewType;

编译通过

但采用此种做法,类的定义和实现部分不能为内联函数,或者报错

"error C2027: use of undefined type ‘NewType‘"

时间: 2024-10-17 11:36:44

VC++ 在两个文件互相包含时会出现的错误的相关文章

cocos2dx小知识——两个头文件相互包含问题

[问题] Game.h包含了Ship.h,并且Ship.h也包含了Game.h. 然后在Game.h中声明了一个成员变量为Ship类:Ship* ship; 会出现找不到Ship类的错误. [解决] 在Game.h头文件中对Ship类进行声明即可:class Ship; [扩展] 如果在Game.cpp和Ship.cpp中相互包含Game.h与Ship.h. 是不会有影响的.

查找两个文件包含的字符串或不包含的字符串shell脚本

一.需求 在这里,我简化一下,因为下午操作这两个文本都是10几万行,但只过滤出这两个文件中含有相同的或不同字符串PPID. 二,步聚 1.文件ha1 a b c 2.文件ha2 a c d 3.找出两个文件都包含有的字符串PPID 3.1过滤脚本 #!/bin/sh #set -x SRC_FILE=$1 TARGET_FILE=$2 RESULT_FILE=$3 >$RESULT_FILE while read LINE do grep $LINE $TARGET_FILE > /dev/n

C/C++ 中头文件相互包含引发的问题

今天下午遇到一个头文件相互包含而导致的编译问题,花了我不少时间去调试没找到问题,最后晚上跟师兄讨论不少时间,突然有所顿悟! 问题重现 我把问题脱离于项目简单描述一下:我写了一个函数 bool func(ClassA* CA) 需要加到项目中,我就把这个函数的声明放到 head1.h 中,函数参数类型 ClassA 定义在另一个头文件 head2.h 中,因此我需要在 head1.h 中包含 head2.h:而 head2.h 中之前又包含了 head1.h,这样就构成了一种头文件相互包含的场景.

Path,Files巩固,题目:从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中

这个题目用传统的File,InputStream可以做,但是如果用Files,Path类做,虽然思路上会困难一些,但是代码简洁了很多,以下是代码: import java.io.IOException; import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.Simple

从键盘接收两个文件夹路径,把其中一个文件夹(包含内容),拷贝到另一个文件夹中

package cn.it.text; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Scanner; /* * 1.从键盘接收两个文件夹路径,把其中一个文件夹(包含内容) * 拷贝到另一个文件

C程序中头文件相互包含精华(转载)

C程序中头文件相互包含精华(网摘小结) 收藏(转自:http://blog.csdn.net/lingyun3429/archive/2010/04/27/5535191.aspx).h中一般放的是同名.c文件中定义的变量.数组.函数的声明,需要让.c外部使用的声明. 1)h文件作用 1 方便开发:包含一些文件需要的共同的常量,结构,类型定义,函数,变量申明: 2 提供接口:对一个软件包来说可以提供一个给外界的接口(例如: stdio.h). 2)h文件里应该有什么 常量,结构,类型定义,函数,

C++中头文件一般包含哪些东西?

头文件和源文件 由于头文件是为了重用,所以在一个复杂的程序中,头文件可能会被间接地重复包含.如果头文件里面都是函数声明,那问题还不大.如果头文件里面有函数定义(如程序11.2),那么就会出现函数被重复定义的错误,程序将无法运行.我们可以采用函数声明和定义分离的方式:把所有的声明都放在shape.h中,把所有的定义放在shape.cpp中.注意必须在shape.cpp中包含shape.h,否则在编译连接时会发生错误.我们在使用时仍然包含shape.h,但由于函数的定义并不在该头文件中,所以就不会被

【转】VC如何调用DLL文件

调用DLL,首先需要将DLL文件映像到用户进程的地址空间中,然后才能进行函数调用,这个函数和进程内部一般函数的调用方法相同.Windows提供了两种将DLL映像到进程地址空间的方法: 1. 隐式的加载时链接 这种方法需要DLL工程经编译产生的LIB文件,此文件中包含了DLL允许应用程序调用的所有函数的列表,当链接器发现应用程序调用了LIB文件列出的某个函数,就会在应用程序的可执行文件的文件映像中加入一些信息,这些信息指出了包含这个函数的DLL文件的名字.当这个应用程序运行时,也就是它的可执行文件

【转】 C++中两个类相互包含引用问题

原文:http://blog.csdn.net/leo115/article/details/7395077 在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型 class A { int i; B b; } class B { int i; A* a; } 请注意上面的定义内容,一般情况下是不能出现类A,类B相互引用都定义对象,即如下的样子: class A { int i; B b; } class B { int