游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4388|回复: 8

命名空间向前引用问题

[复制链接]

36

主题

109

帖子

111

积分

注册会员

Rank: 2

积分
111
发表于 2008-7-9 09:47:00 | 显示全部楼层 |阅读模式
我经常看到这样的定义
namespace Ogre
{
  class AxisAlignedBox;
  class Image;
  class ColourValue;
  class DataStream;
  class Ray;
}
他们把这个放在一个.h文件的开头,说是向前声明,但是感觉没什么意义,因为这些类的头文件都已经包含了,你向前声明能有什么意思哪,这里实在不明白。我模仿他自己做了一个命名空间文件
xiaohua.h
内容为
namespace NAME
{

        class xiaohua
        {
        public:
                xiaohua(){name="jack";}
                char *name;
                char* getname(){return name;}


        };

}

然后在main.h中这样用
#include "stdafx.h"
#include "name.h"
namespace NAME
{
        class xiaohua;
}
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
        xiaohua a;
  cout<<a.getname();
        char c;
        std::cin>>c;
        return 0;
}

结果压根就编译不过去,错误内容为
c:\documents and settings\lwming\桌面\ogresample\myvector\myvector.cpp(13): error C2065: “xiaohua” : 未声明的标识符
c:\documents and settings\lwming\桌面\ogresample\myvector\myvector.cpp(13): error C2146: 语法错误 : 缺少“;”(在标识符“a”的前面)
c:\documents and settings\lwming\桌面\ogresample\myvector\myvector.cpp(13): error C2065: “a” : 未声明的标识符
c:\documents and settings\lwming\桌面\ogresample\myvector\myvector.cpp(14): error C2228: “.getname”的左侧必须有类/结构/联合类型
        类型是“'unknown-type'”
c:\documents and settings\lwming\桌面\ogresample\myvector\myvector.cpp(14): error C3861: “a”: 即使使用参数相关的查找,也未找到标识符

不知道为什么,如果我把
向前引用注释掉
//namespace NAME
//{
        //class xiaohua;
//}
然后换上using namespace NAME;就可以顺利编译通过,谁能给小弟讲讲这方面的问题

89

主题

4036

帖子

4132

积分

论坛元老

Rank: 8Rank: 8

积分
4132
发表于 2008-7-9 12:32:00 | 显示全部楼层

Re:命名空间向前引用问题

一看就知道没做过工程

36

主题

109

帖子

111

积分

注册会员

Rank: 2

积分
111
 楼主| 发表于 2008-7-9 13:39:00 | 显示全部楼层

Re:命名空间向前引用问题

楼上知道就讲下了,谁不是从不知道到知道的?

5

主题

972

帖子

975

积分

高级会员

Rank: 4

积分
975
发表于 2008-7-9 13:43:00 | 显示全部楼层

Re:命名空间向前引用问题

xiaohua a;这句应该是NAME::xiaohua a;吧
而且
namespace NAME
{
class xiaohua;
}
这个是多余的,因为你程序里已经用到了xiaohua这个类的定义,光是声明的话编译器不知道怎么为a这个对象分配空间,这个时候不得不包含头文件xiaohua.h了

5

主题

972

帖子

975

积分

高级会员

Rank: 4

积分
975
发表于 2008-7-9 13:45:00 | 显示全部楼层

Re:命名空间向前引用问题

前向声明只能用在你需要引用某个类名,但不需要使用类的定义的时候。为的是避免包含不必要的头文件

36

主题

109

帖子

111

积分

注册会员

Rank: 2

积分
111
 楼主| 发表于 2008-7-9 16:04:00 | 显示全部楼层

Re:命名空间向前引用问题

谢谢,似乎有点明白了

36

主题

109

帖子

111

积分

注册会员

Rank: 2

积分
111
 楼主| 发表于 2008-7-9 16:38:00 | 显示全部楼层

Re:命名空间向前引用问题

根据CLOD的提示,我对程序作了如下改动;
1,增加了一个.h文件,里面定义了一个新类和一个新命名空间,文件名为:
   age.h
内容为:
namespace AGE
{

        class Age
        {
          public:
                  Age(int b=10):a(b){}
                  int getage(){return a;}
                  int a;

        };
}
2,对原name.h文件做了如下修改,修改后的name.h内容如下:
namespace AGE
{
        class Age;
}
namespace NAME
{

        class xiaohua
        {
        public:
                xiaohua(){name="jack";}
                char *name;
                char* getname(){return name;}
                AGE::Age age;
        };

}
3,主文件中内容如下:
#include "stdafx.h"
#include "age.h"
#include "name.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
        NAME::xiaohua a;
  cout<<a.getname()<<endl<<a.age.getage();
        char c;
        std::cin>>c;
        return 0;
}

我发现这样修改程序运行良好,但是当我把
#include "age.h"
#include "name.h"
两个出现的次序对调后,程序编译就会报错,错误内容为
>c:\documents and settings\lwming\桌面\ogresample\myvector\name.h(15) : error C2079: 'NAME::xiaohua::age' uses undefined class 'AGE::Age'
1>c:\documents and settings\lwming\桌面\ogresample\myvector\myvector.cpp(13) : error C2228: left of '.getage' must have class/struct/union

不知道我可以不可以这样理解,如果向前引用的话,那么被引用的类的头文件一定要出现在引用者头文件之前,这样其不是平常要非常注意文件包含持续,不知道是不是还有其他技巧

86

主题

2251

帖子

2386

积分

金牌会员

Rank: 6Rank: 6

积分
2386
QQ
发表于 2008-7-9 22:13:00 | 显示全部楼层

Re:命名空间向前引用问题

这么做可以节省编译时间啊

向前声明,就是告诉后面的代码,有这么个类,具体细节还没有告诉后面代码。

不知道具体细节,当然没法定义这个类的变量,更不可以用这个类的方法。

一般都是这么写:

class AAA;

class BBB {
private:
    AAA* a;    // 注意是指针,定义指针不需要知道指针所指的类型变量的细节
//...
};

36

主题

109

帖子

111

积分

注册会员

Rank: 2

积分
111
 楼主| 发表于 2008-7-10 08:53:00 | 显示全部楼层

Re:命名空间向前引用问题

谢谢各位,明白了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-22 01:29

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表