注册 登录
编程论坛 C++教室

多个文件相互包含的调错

bibingyan 发布于 2008-04-19 08:26, 680 次点击
0.3.cpp
Linking...
0.3.obj : error LNK2001: unresolved external symbol "double __cdecl compare::max(double const *,int)" (?max@compare@@YANPBNH@Z)
0.3.obj : error LNK2001: unresolved external symbol "double __cdecl compare::min(double const *,int)" (?min@compare@@YANPBNH@Z)
Debug/0.3.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.

0.3.exe - 3 error(s), 0 warning(s)
改了很久,不知道哪里错了..
是这样的:
compare.h文件中,声明了两个模板函数;
在compare.cpp中去定义这个个模板(包含了compare.h);
然后在03.cpp中用这个函数(包含了compare.h).
2 回复
#2
yijing212008-04-19 09:03
楼主说的不清不楚  你把程序贴上来 看下啊   头文件条件编译了没
#3
yeyuanzhi2008-04-19 09:03
回复 1# 的帖子
基本方法:两个类文件相互包含,去掉一个包含,改为声明。

水平有限,给出几个例子:

注意:只包含必须表示的代码
使用vc6.0

例子一:
////////////////////////////////////////////////////////////////////
// A.h文件

class B;//声明B
class A  
{
public:
    A();
    virtual ~A();

    B* m_b;//必须是指针,如是变量就不行了。因为B.h文件中有A m_a;如果写为B m_b;那就是真正的相互包含了,无穷递推了。
};

////////////////////////////////////////////////////////////////////
// A.cpp文件

#include "A.h"
//#include "B.h"

A::A()
{
   m_b=NULL;
}

A::~A()
{

}

////////////////////////////////////////////////////////////////////
// B.h文件

#include "A.h"
//class A;

class B  
{
public:
    B();
    virtual ~B();

    A m_a;
};

////////////////////////////////////////////////////////////////////
// B.cpp文件

#include "B.h"
//#include "A.h"

B::B()
{

}

B::~B()
{

}

////////////////////////////////////////////////////////////////////
//主函数文件

#include "A.h"//去掉也可以
#include "B.h"

int main(int argc, char *argv[])
{
    B myB;
    A myA;

    return 0;
}
////////////////////////////////////////////////////////////////////


例子二:
只是更改例子一的B.h文件

////////////////////////////////////////////////////////////////////
// B.h文件

//#include "A.h"

class A;
class B  
{
public:
    B();
    virtual ~B();

    A* m_a;//注意如果写为A m_a;不行。要想的话,必须加#include "A.h"

};

////////////////////////////////////////////////////////////////////


例子三:
也只是更改例子一的B.h文件

////////////////////////////////////////////////////////////////////
// B.h文件

#include "A.h"
class A;//去掉也可
class B  
{
public:
    B();
    virtual ~B();

    A* m_pa;//指针
    A  m_a; //非指针

};
////////////////////////////////////////////////////////////////////


例子四:
////////////////////////////////////////////////////////////////////
// A.h文件

class B;
class A  
{
public:
    A();
    virtual ~A();

    void Set(B& b,const int value=0);

};

////////////////////////////////////////////////////////////////////
// A.cpp文件

#include "A.h"
#include "B.h"

A::A()
{

}

A::~A()
{

}

void A::Set(B& b,const int value)
{
    b.m=value;
};

////////////////////////////////////////////////////////////////////
// B.h文件

#include "A.h"
//class A;//去不去掉皆可
class B  
{
public:
    B();
    virtual ~B();

    void Print();

    friend void A::Set(B& b,const int value);
private:
    int m;
};

////////////////////////////////////////////////////////////////////
// B.cpp文件

#include "B.h"

B::B():m(20)
{

}

B::~B()
{

}

void B::Print()
{
    printf("%d\n",m);
}


////////////////////////////////////////////////////////////////////
//主函数文件

#include "A.h"//去掉也可以
#include "B.h"

int main(int argc, char *argv[])
{
    B myB;
    A myA;

    myB.Print();
    myA.Set(myB,99);
    myB.Print();

    return 0;
}

////////////////////////////////////////////////////////////////////
1