Codejie's C++ Space

Using C++

求解:编译顺序问题


    环境:VC Express 2008

    如下代码,编译失败。

    classA.h

#ifndef __CLASSA_H__
#define __CLASSA_H__

#include 
<vector>

#include 
"nameA.h"

class CA
{
public:
    typedef std::vector
<int> TVector;
public:
    CA() 
{}
}
;

#endif


 nameA.h
#ifndef __NAMEA_H__
#define __NAMEA_H__

#include 
"classA.h"

namespace NA
{

typedef 
int INT;

class CB
{
public:
    CB();
    
void Func(CA::TVector& vct);
}
;

}


#endif

main.cpp
#include "classA.h"
#include 
"nameA.h"

int main()
{
    
return 0;
}



    编译错误为:
1>------ Build started: Project: namespace, Configuration: Debug Win32 ------
1>Compiling
1>main.cpp
1>d:\temp\namespace\namea.h(15) : error C2653: 'CA' : is not a class or namespace name
1>d:\temp\namespace\namea.h(15) : error C2061: syntax error : identifier 'TVector'
1>Build log was saved at "file://d:\Temp\namespace\Debug\BuildLog.htm"
1>namespace - 2 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

   这个错误是典型的引用顺序引起的,修改main.cpp中的#include顺序可以编译成功。
#include "nameA.h"
#include "classA.h"

int main()
{
    return 0;
}

    或者在classA.h中删除对nameA.h的引用也可。
#ifndef __CLASSA_H__
#define __CLASSA_H__

#include 
<vector>

//#include "nameA.h"

class CA
{
public:
    typedef std::vector
<int> TVector;
public:
    CA() 
{}
}
;

#endif


   OK,现在问题如下,若classA.h需要引用nameA.h时,该如何解决这个问题?

   classA.h如下所示时。
#ifndef __CLASSA_H__
#define __CLASSA_H__

#include 
<vector>

#include 
"nameA.h"

class CA
{
public:
    typedef std::vector
<NA::INT> TVector;
public:
    CA() 
{}
}
;

#endif


posted on 2010-06-11 17:03 codejie 阅读(1882) 评论(12)  编辑 收藏 引用 所属分类: C++

评论

# re: 求解:编译顺序问题 2010-06-11 18:32 风吹云散尽

呵呵 很简单 代码不能这么写
类的依赖关系不允许形成循环,放你这里就是两个类不能互相都依赖对方。  回复  更多评论   

# re: 求解:编译顺序问题[未登录] 2010-06-11 19:02 codejie

@风吹云散尽
是的,把CB类去掉,只留下
typedef int INT;
void Func(CA::TVector& vt);
这样也不行,相对于空间概念来说是namespace和class是一样的。
我现在想知道再不增加新文件的情况下,当然了,也别合成一个文件,有解决办法不?
  回复  更多评论   

# re: 求解:编译顺序问题 2010-06-11 22:20 taowang

只需要将 nameA.h 中的:

#include "classA.h"

替换为:

class CA;

即可。
  回复  更多评论   

# re: 求解:编译顺序问题[未登录] 2010-06-11 22:49 codejie

@taowang
CA::TVector这个类型怎么让编译器知道呢?
这种前置方式一般只能用于nameA.h中CA的指针或引用实例。当含有类型时,就不好用了~  回复  更多评论   

# re: 求解:编译顺序问题 2010-06-11 23:28 陈梓瀚(vczh)

不是合并成一个文件,而是你要拆成3个文件。  回复  更多评论   

# re: 求解:编译顺序问题[未登录] 2010-06-12 00:00 codejie

@陈梓瀚(vczh)
嗯,我只是不想增加新文件。
这里只是个例子,实际代码太多,要移动到新文件中,工作量太大了,所以想看看有没有其它方法~  回复  更多评论   

# re: 求解:编译顺序问题 2010-06-12 02:08 陈梓瀚(vczh)

@codejie
文件多容易管,实在不行你用C#,人家没有头文件,声明没有顺序,类库还大,多爽  回复  更多评论   

# re: 求解:编译顺序问题 2010-06-12 09:02 Kevin Lynx

个人觉得这种情况,就设计感觉上来说就不好。互相耦合。单就这个情况来看,可以把类型抽离到一个公共文件里。如果是对类本身的依赖,当然可以使用前置声明。  回复  更多评论   

# re: 求解:编译顺序问题 2010-06-12 09:36 codejie

@陈梓瀚(vczh)
在我看来文件超过15个就难管了,一般这时我就开始封装库了。。。
C#就扯远了,BASIC不更好,变量都可以不定义呢。。。咱们还是C++吧~  回复  更多评论   

# re: 求解:编译顺序问题 2010-06-12 09:39 codejie

@Kevin Lynx
说的没错,变成这样是有历史原因的,写着写着就开始耦合了,都没有注意到。。。目前做的修改就是在分离类型,只是有点乱,一时还真不好下手,所以总想着有没有偷懒的法子。。。(看来没有了。。。)  回复  更多评论   

# re: 求解:编译顺序问题 2010-06-12 15:34 陈梓瀚(vczh)

@codejie
几百个文件上千个类我觉得都是正常的吧,功能一多代码自然就要多了……毕竟文件那只是物理结构,跟代码一点关系都没有,何必在意。你是编程还是编文件啊……  回复  更多评论   

# re: 求解:编译顺序问题 2010-06-12 16:25 codejie

@陈梓瀚(vczh)
说来惭愧,从来没自己写过一个超过100+个文件的工程,都很零散。。。  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


公告

Using C++

导航

统计

留言簿(73)

随笔分类(513)

积分与排名

最新评论

阅读排行榜

评论排行榜