___942230032___ 2014-07-21 14:52 采纳率: 0%
浏览 2069

在VS2005中单个工程里建立两个CWinThread的派生类,编译时发出C2084错误,怎么解决?

=====描述=====

我在VS2005中用项目->添加类添加了两个CWinThread类的派生类——CMyThread与CFloatWndThread,现在编译时报C2084错误,百度上都说是函数有定义了两个函数体,但我没发现有什么重定义啊~~请问大家有何高招??

=====代码=====

//MyThread.h
#include "stdafx.h"
// CMyThread

class CMyThread : public CWinThread
{
DECLARE_DYNCREATE(CMyThread)

 protected:
CMyThread();           // 动态创建所使用的受保护的构造函数
virtual ~CMyThread();
afx_msg void OnStateChange(UINT wp,LONG lp);
NOTIFYICONDATA caps;

public:
virtual BOOL InitInstance();
virtual int ExitInstance();
HICON capson,capsoff;
CWinThread* ThreadP;
protected:
DECLARE_MESSAGE_MAP()
};

#endif

// MyThread.cpp : 实现文件
//

#include "stdafx.h"
#include "Project.h"
#include "MyThread.h"


// CMyThread
IMPLEMENT_DYNCREATE(CMyThread, CWinThread)

CMyThread::CMyThread()
{
}

CMyThread::~CMyThread()
{
}
//下面代码没有错误,省略。。

//FloatWndThread.h
#pragma once
#ifndef FLOAT_WINDOW_THREAD
#define FLOAT_WINDOW_THREAD
#include "FloatWnd.h"

// CFloatWndThread

class CFloatWndThread : public CWinThread
{
    DECLARE_DYNCREATE(CFloatWndThread)
DECLARE_DYNAMIC(CFloatWndThread)
static CObject* PASCAL CFloatWndThread::CreateObject();
protected:

    virtual ~CFloatWndThread();

public:
    CFloatWndThread();
    virtual BOOL InitInstance();
    virtual int ExitInstance();

protected:
    DECLARE_MESSAGE_MAP()
private:
    HMODULE hMod;
    CFloatWnd* pFWnd;
};

#include "FloatWndThread.cpp"
#endif

// FloatWndThread.cpp : 实现文件
//
#ifndef _FLOAT_WINDOW_THREAD_CPP
#define _FLOAT_WINDOW_THREAD_CPP
#include "stdafx.h"
#include "Project.h"
#include "FloatWndThread.h"
#include "FloatWnd.h"
//using namespace Inflict;
// CFloatWndThread

IMPLEMENT_DYNCREATE(CFloatWndThread, CWinThread)

CFloatWndThread::CFloatWndThread(){}

CFloatWndThread::~CFloatWndThread(){}

BOOL CFloatWndThread::InitInstance()
{
hMod = LoadLibraryA("FloatWnd.dll");
if(hMod)
{
pNewFloatWnd NewFloatWnd = (pNewFloatWnd)::GetProcAddress(hMod,"NewFloatWnd");
pShowFloatWnd ShowFloatWnd = (pShowFloatWnd)::GetProcAddress(hMod,"ShowFloatWnd");
if(NewFloatWnd&&ShowFloatWnd)
{
pFWnd=NewFloatWnd();
if(pFWnd)
{
ShowFloatWnd(pFWnd,NULL);
//pFWnd->DoModal();
}
}
}
// TODO: 在此执行任意逐线程初始化
return TRUE;
}

int CFloatWndThread::ExitInstance()
{

// TODO: 在此执行任意逐线程清理
return CWinThread::ExitInstance();
}

BEGIN_MESSAGE_MAP(CFloatWndThread, CWinThread)
END_MESSAGE_MAP()

// CFloatWndThread 消息处理程序
#endif

=====输出=====

1>FloatWndThread.cpp
1>d:\我的文档\visual studio 2005\projects\project\project\floatwndthread.h(11) : error C2535: “CRuntimeClass *CFloatWndThread::_GetBaseClass(void)”: 已经定义或声明成员函数
1> d:\我的文档\visual studio 2005\projects\project\project\floatwndthread.h(10) : 参见“CFloatWndThread::_GetBaseClass”的声明
1>d:\我的文档\visual studio 2005\projects\project\project\floatwndthread.h(11) : error C2086: “const CRuntimeClass CFloatWndThread::classCFloatWndThread”: 重定义
1> d:\我的文档\visual studio 2005\projects\project\project\floatwndthread.h(10) : 参见“CFloatWndThread::classCFloatWndThread”的声明
1>d:\我的文档\visual studio 2005\projects\project\project\floatwndthread.h(11) : error C2535: “CRuntimeClass *CFloatWndThread::GetThisClass(void)”: 已经定义或声明成员函数
1> d:\我的文档\visual studio 2005\projects\project\project\floatwndthread.h(10) : 参见“CFloatWndThread::GetThisClass”的声明
1>d:\我的文档\visual studio 2005\projects\project\project\floatwndthread.h(11) : error C2535: “CRuntimeClass *CFloatWndThread::GetRuntimeClass(void) const”: 已经定义或声明成员函数
1> d:\我的文档\visual studio 2005\projects\project\project\floatwndthread.h(10) : 参见“CFloatWndThread::GetRuntimeClass”的声明
1>d:\我的文档\visual studio 2005\projects\project\project\floatwndthread.h(12) : error C2535: “CObject *CFloatWndThread::CreateObject(void)”: 已经定义或声明成员函数
1> d:\我的文档\visual studio 2005\projects\project\project\floatwndthread.h(10) : 参见“CFloatWndThread::CreateObject”的声明
1>d:\我的文档\visual studio 2005\projects\project\project\floatwndthread.cpp(12) : error C2084: 函数“CObject *CFloatWndThread::CreateObject(void)”已有主体
1> d:\我的文档\visual studio 2005\projects\project\project\floatwndthread.h(10) : 参见“CreateObject”的前一个定义
1>d:\我的文档\visual studio 2005\projects\project\project\floatwndthread.cpp(12) : error C2084: 函数“CRuntimeClass *CFloatWndThread::_GetBaseClass(void)”已有主体
1> d:\我的文档\visual studio 2005\projects\project\project\floatwndthread.h(10) : 参见“_GetBaseClass”的前一个定义
1>d:\我的文档\visual studio 2005\projects\project\project\floatwndthread.cpp(12) : error C2374: “classCFloatWndThread”: 重定义;多次初始化
1> d:\我的文档\visual studio 2005\projects\project\project\floatwndthread.h(10) : 参见“classCFloatWndThread”的声明
1>d:\我的文档\visual studio 2005\projects\project\project\floatwndthread.cpp(12) : error C2084: 函数“CRuntimeClass *CFloatWndThread::GetThisClass(void)”已有主体
1> d:\我的文档\visual studio 2005\projects\project\project\floatwndthread.h(10) : 参见“GetThisClass”的前一个定义
1>d:\我的文档\visual studio 2005\projects\project\project\floatwndthread.cpp(12) : error C2084: 函数“CRuntimeClass *CFloatWndThread::GetRuntimeClass(void) const”已有主体
1> d:\我的文档\visual studio 2005\projects\project\project\floatwndthread.h(10) : 参见“GetRuntimeClass”的前一个定义
1>d:\我的文档\visual studio 2005\projects\project\project\floatwndthread.cpp(15) : error C2084: 函数“CFloatWndThread::CFloatWndThread(void)”已有主体
1> d:\我的文档\visual studio 2005\projects\project\project\floatwndthread.h(18) : 参见“{ctor}”的前一个定义
1>d:\我的文档\visual studio 2005\projects\project\project\floatwndthread.cpp(19) : error C2084: 函数“CFloatWndThread::~CFloatWndThread(void)”已有主体
1> d:\我的文档\visual studio 2005\projects\project\project\floatwndthread.h(15) : 参见“{dtor}”的前一个定义
1>d:\我的文档\visual studio 2005\projects\project\project\floatwndthread.cpp(23) : error C2084: 函数“BOOL CFloatWndThread::InitInstance(void)”已有主体
1> d:\我的文档\visual studio 2005\projects\project\project\floatwndthread.h(19) : 参见“InitInstance”的前一个定义
1>d:\我的文档\visual studio 2005\projects\project\project\floatwndthread.cpp(44) : error C2084: 函数“int CFloatWndThread::ExitInstance(void)”已有主体
1> d:\我的文档\visual studio 2005\projects\project\project\floatwndthread.h(20) : 参见“ExitInstance”的前一个定义
1>d:\我的文档\visual studio 2005\projects\project\project\floatwndthread.cpp(50) : error C2084: 函数“const AFX_MSGMAP *CFloatWndThread::GetMessageMap(void) const”已有主体
1> d:\我的文档\visual studio 2005\projects\project\project\floatwndthread.h(23) : 参见“GetMessageMap”的前一个定义
1>d:\我的文档\visual studio 2005\projects\project\project\floatwndthread.cpp(50) : error C2084: 函数“const AFX_MSGMAP *CFloatWndThread::GetThisMessageMap(void)”已有主体
1> d:\我的文档\visual studio 2005\projects\project\project\floatwndthread.h(23) : 参见“GetThisMessageMap”的前一个定义
1>d:\我的文档\visual studio 2005\projects\project\project\floatwndthread.cpp(55) : fatal error C1020: 意外的 #endif

  • 写回答

1条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-03-16 12:08
    关注

    该回答引用ChatGPT

    根据你提供的代码和错误信息,问题可能出现在FloatWndThread.h文件中。错误信息中指出该文件中有多个函数定义,这可能会导致重定义错误。请尝试删除文件顶部的#pragma once,并用标准的头文件保护方式来替换。例如:

    #ifndef FLOAT_WINDOW_THREAD_H
    #define FLOAT_WINDOW_THREAD_H
    
    // your code here
    
    #endif // FLOAT_WINDOW_THREAD_H
    

    此外,在FloatWndThread.h文件中,您在声明CFloatWndThread类时使用了DECLARE_DYNAMIC和DECLARE_DYNCREATE宏,但在实现文件FloatWndThread.cpp中没有包含相应的宏实现。您可以删除头文件中的DECLARE_DYNAMIC和DECLARE_DYNCREATE宏,并将实现文件中的IMPLEMENT_DYNCREATE宏改为如下代码:

    IMPLEMENT_DYNCREATE(CFloatWndThread, CWinThread)
    
    CRuntimeClass* CFloatWndThread::GetRuntimeClass() const
    {
        return RUNTIME_CLASS(CFloatWndThread);
    }
    

    请注意,此代码使用了RUNTIME_CLASS宏来返回类的CRuntimeClass指针。此外,如果您还没有将AFX_MANAGE_STATE宏添加到InitInstance函数中,请尝试将其添加到此函数开头,以确保正确的MFC上下文已经初始化。


    希望这些信息可以帮助您解决问题。

    评论

报告相同问题?

悬赏问题

  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序
  • ¥15 onvif+openssl,vs2022编译openssl64