首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

:两个类相互引用,无法编译。(VS 2003 .net VC++7)

2012-04-20 
请教高手:两个类相互引用,无法编译。(VS 2003 .net VC++7)classAclassB{public:A*avoidset(A*p){ap}voi

请教高手:两个类相互引用,无法编译。(VS 2003 .net VC++7)
class   A;
class   B
{
public:
        A   *   a;
        void   set(A   *   p){a   =   p};
        void   func1()
        {
                a-> func2();
        }
        void   func2()
        {

        }
};
class   A
{
public:
        B   *   b;
        void   set(B   *   p){b   =   p};
        void   func1()
        {
                b-> func2();
        }
        void   func2()
        {

        }
};

int   main()
{
        A   a;
        B   b;
        a.set(&b);
        a.func1();

        return   0;
}


正在编译...
Test1.cpp
g:\opengl游戏程序设计\source\chapter21\test1\test1.cpp(60)   :   error   C2143:   语法错误   :   缺少“;”(在“}”的前面)
g:\opengl游戏程序设计\source\chapter21\test1\test1.cpp(63)   :   error   C2027:   使用了未定义类型“A”
                g:\opengl游戏程序设计\source\chapter21\test1\test1.cpp(54)   :   参见“A”的声明
g:\opengl游戏程序设计\source\chapter21\test1\test1.cpp(63)   :   error   C2227:   “-> func2”的左侧必须指向类/结构/联合

生成日志保存在“file://g:\OpenGL游戏程序设计\Source\chapter21\Test1\Debug\BuildLog.htm”中
Test1   -   3   错误,0   警告

不管把哪个类放在前面,都会报错。请教高手,不要改变上述类的功能,使程序编译通过。




[解决办法]
首先,
void set(A * p){a = p};
要改成:
void set(A * p){a = p;}
[解决办法]
class A;
class B
{
public:
A * a;
void set(A * p);
void func1();
void func2();
};
class A
{
public:
B * b;
void set(B * p);
void func1();
void func2();
};
void A:: set(B * p)
{b = p;}

void B::set(A * p)
{
}

void B::func1()
{
a-> func2();
}
void B::func2()
{
}

void A::func1()
{
b-> func2();
}
void A::func2()
{
}

int main()
{
A a;
B b;
a.set(&b);
a.func1();
}

[解决办法]
你这叫恶搞!
不要这么做!
[解决办法]
晨星老大都说了,偶来看看

只是想说,设计良好的程序应该尽量避免这种相互引用。
如果感觉不可避免,就使用头文件声明和cpp文件定义的方式来解决。
[解决办法]
真能想...

热点排行