自已写了一个类A,能够执行某些操作;在Dll工程中定义了另外一个类B,在类B中引用了类A的头文件,并声明了一个类A的成员变量。生成Dll和lib最后,提供给客户端C使用。客户端C在编译的时候,不仅需要上面的Dll、Lib、类B的头文件,而且还需要类A的头文件,否则就编译不过去。这个问题如何解决?怎样才不用给客户端提供类A的头文件?
//-------------------------------------------
类A、B的关系:
class 类A
{
public:
    A();
    ~A();
    ...//成员函数
};////////////////////////
#include "类A.h"
class 类B
{
public:
    类A m_***;   //声明一个类A的成员变量
    B();
    ~B();
    ...//成员函数
};//客户端---
#include "类B.h"
class 类C
{
public:
    类B m_***;   //声明一个类B的成员变量
    C();
    ~C();
    ...//成员函数
};编译客户端C的时候会提示在类B中“类A m_***;”这句出错,类A未定义。
除非把类A的头文件也拷贝到客户端C的工程目录才能正常编译。
这个问题任何解决?

解决方案 »

  1.   

    路过,我也遇到这问题,好像只能把头文件给你别人,不然B类怎么用A类呢, 连A里面的数据成员和成员函数都不知道,你让LINK 程序怎么链啊...大小都没有能分配内存吗
      

  2.   

    显示调用,边lib都省了,
    隐式的话必须要.h
      

  3.   

    楼上的,我在Dll里面导出了一个类,如果显示调用的话,有点麻烦;这不为了省事嘛
      

  4.   

    不要A.h怎么知道A是怎样声明的呢
      

  5.   

    若不用.lib和.h只有采用寻址方式调用,否则不可能'
    下面的示例是寻址调用示例(需要知道函数名及调用参数类型)CHAR *CResult;
    HINSTANCE hModule;
    typedef CHAR *(MyType)(CHAR *);
     
     MyType* pfunMyType =NULL;  //导入文件myDll.DLL
     VERIFY(hModule = ::LoadLibrary("MyDll.dll"));//得到DLL中函数GetStr()的地址
     try{
          VERIFY(
          pfunMyType = 
      (MyType*)::GetProcAddress(
                (HMODULE) hModule, "GetStr")
       ); CHAR *ch;   ch="EXE传过去的字符串";
       CResult = (*pfunMyType)(ch);  //得以DLL返回的字符串内容  }
       // 释放DLL
     catch(...)
     {MessageBox("调用DLL中函数失败","错误",MB_OK|MB_ICONINFORMATION);}
       FreeLibrary(hModule);