=====描述=====
我在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
该回答引用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上下文已经初始化。
希望这些信息可以帮助您解决问题。