标题:多个文件相互包含的调错
只看楼主
bibingyan
Rank: 1
来 自:湖南长沙
等 级:新手上路
帖 子:123
专家分:0
注 册:2008-3-16
 问题点数:0 回复次数:2 
多个文件相互包含的调错
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).
搜索更多相关主题的帖子: compare double 文件 symbol 
2008-04-19 08:26
yijing21
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2007-11-7
得分:0 
楼主说的不清不楚  你把程序贴上来 看下啊   头文件条件编译了没
2008-04-19 09:03
yeyuanzhi
Rank: 1
等 级:禁止访问
帖 子:88
专家分:0
注 册:2005-12-31
得分:0 
回复 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;
}

////////////////////////////////////////////////////////////////////
2008-04-19 09:03



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-209877-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.507072 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved