抽象类继承的问题

ztenv 版主
博客专家认证
2009-06-19 08:54:37
我的抽象类定义:


在工程A中定义了抽象类:

AbstractThread.h 文件

#pragma once

#include "windows.h"
#include "string"
using namespace std;

///抽象的线程基类
class AbstractThread
{
public:
AbstractThread(void);
virtual ~AbstractThread(void);

virtual void Run(void * para)=0;
DWORD Suspend();
DWORD Resume();
bool Stop();
bool IsAlive();
HANDLE GetHandle();
string GetThreadID();
string GetThreadName();
protected:
string threadName;
string threadID;
HANDLE threadHandle;
};


在工程B中继承了AbstractThread类,
头文件:ProductThread.h

#pragma once

#include "..\MutexThreads\AbstractThread.h"
#include "windows.h"

typedef struct
{
int Number1;
int Number2;
} TPara;

class ProductThread:public AbstractThread
{
public:

virtual void Run(void * para);

ProductThread(void);
virtual ~ProductThread(void);
private:

static unsigned _stdcall ProductNumber(void * para);
static unsigned _stdcall WasteNumber(void * para);

static HANDLE ProduceHandle;
static HANDLE WasteHandle;
};


ProductThread.cpp代码如下:

HANDLE ProductThread::ProduceHandle=NULL;
HANDLE ProductThread::WasteHandle=NULL;

ProductThread::ProductThread(void):AbstractThread()
{
srand((unsigned)time(NULL));
this->ProduceHandle=CreateSemaphore(NULL,1,1,NULL);
this->WasteHandle=CreateSemaphore(NULL,0,1,NULL);
this->threadName="";
}

void ProductThread::Run(void * para)
{
unsigned int a=0;
this->threadHandle=(HANDLE)_beginthreadex(NULL,0,ProductThread::ProductNumber,para,CREATE_SUSPENDED,&a);
char * temp=new char[255];
memset(temp,'\0',255);
_itoa(a,temp,10);
this->threadID.assign(temp);
delete[] temp;
}

unsigned _stdcall ProductThread::ProductNumber(void * para)
{
WaitForSingleObject(ProduceHandle,INFINITE);

TPara * p=(TPara *)para;
//等待生产的信号量,直到处于发信号状态,则生产数据
/*int num1=rand();
int num2=rand();*/
p->Number1=rand();
p->Number2=rand();
Sleep(rand()%1000);
ReleaseSemaphore(WasteHandle,1,NULL);
//随机产生两个数字,返回给主调函数
//并让消费信号量处于发信号状态

return 0;
}

unsigned _stdcall ProductThread::WasteNumber(void *para)
{
WaitForSingleObject(WasteHandle,INFINITE);

TPara *p=(TPara *) para;

long sum=p->Number1+p->Number2;
cout<<p->Number1<<"+"<<p->Number2<<"="<<sum<<endl;

ReleaseSemaphore(ProduceHandle,1,NULL);
return 0;
}


ProductThread::~ProductThread(void)
{

ReleaseSemaphore(this->ProduceHandle,1,NULL);
ReleaseSemaphore(this->WasteHandle,1,NULL);

CloseHandle(this->ProduceHandle);
CloseHandle(this->WasteHandle);
}





编译的时候报错:

Error 1 error LNK2019: unresolved external symbol "public: virtual __thiscall AbstractThread::~AbstractThread(void)" (??1AbstractThread@@UAE@XZ) referenced in function __unwindfunclet$??0ProductThread@@QAE@XZ$0 ProductThread.obj SemaphoreThread


Error 2 error LNK2019: unresolved external symbol "public: __thiscall AbstractThread::AbstractThread(void)" (??0AbstractThread@@QAE@XZ) referenced in function "public: __thiscall ProductThread::ProductThread(void)" (??0ProductThread@@QAE@XZ) ProductThread.obj SemaphoreThread



Error 3 fatal error LNK1120: 2 unresolved externals F:\private\个人作品\c++\线程\Thread\Debug\SemaphoreThread.exe SemaphoreThread



很让人奇怪:在AbstractThread的同一工程中继承并且实现Run()成员函数,就没有问题,在工程B中同样的方式继承AbstractThread就报上面的错误,百思不得其解,望高手指点一下,谢谢!
...全文
450 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
ztenv 版主 2009-06-19
  • 打赏
  • 举报
回复
我还不能给贴子加分,郁闷!对不住各位了
ztenv 版主 2009-06-19
  • 打赏
  • 举报
回复
终于按所想的方式解决了:
1、在工程B中,Add Existing Items...把AbstractThread.h 和AbstractThread.cpp添加到工程B中
2、在工程B的ProductThread.h中引用AbstractThread.h(相对引用#include "..\MutexThreads\AbstractThread.h")
3、编译,通用了
谢谢各位,加分结贴
fiy326 2009-06-19
  • 打赏
  • 举报
回复
对,添加现有项到工程
ztenv 版主 2009-06-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 arong1234 的回复:]
如果不是纯抽象类,要么是库形式提供,要么是把它源码加入所有工程,个人倾向于后一种,“总不能”干什么?加入又没有什么代价

所以如果你不原意这么做,就不要随意使用别得工程得类。工程之间最好的交互方法是“服务交互”,也就是一个工程通过某个服务访问另外一个工程的功能(如SOAP),次之的是接…
[/Quote]
我其实想要实现的是:在一个工程pa中声明了一个类A,然后在在工程pa中写了一个测试类B,没有问题,然后我想在另一工程pb中再写一类C继承类A:::
(BTW:你为什么需要拷贝过去?你只要把文件直接加入,不一定要拷贝到你自己工程目录下,当然两个工程应该在同一个机器上)
“你只要把文件直接加入,不一定要拷贝到自己工程目录下”是什么意思呢?怎么直接加入?
是右键工程,选择"Add Exiting Item..."?

谢谢!
arong1234 2009-06-19
  • 打赏
  • 举报
回复
如果不是纯抽象类,要么是库形式提供,要么是把它源码加入所有工程,个人倾向于后一种,“总不能”干什么?加入又没有什么代价(BTW:你为什么需要拷贝过去?你只要把文件直接加入,不一定要拷贝到你自己工程目录下,当然两个工程应该在同一个机器上)

所以如果你不原意这么做,就不要随意使用别得工程得类。工程之间最好的交互方法是“服务交互”,也就是一个工程通过某个服务访问另外一个工程的功能(如SOAP),次之的是接口共享,也就是定义没有任何实际实现的纯虚类共享。直接继承另外一个工程的类是非常非常不好的习惯
[Quote=引用 8 楼 lianshaohua 的回复:]
已解决了,谢谢各位!
当遇到这种问题时应该如何解决呢?
一个基类在一个工程文件中,我想在另一个工程中继承此基类,总不能每次都把基类的.h 、.cpp文件拷贝到我的派生类所在的工程中吧?
[/Quote]
goodname 2009-06-19
  • 打赏
  • 举报
回复
可以将工程A做成库的形式
ztenv 版主 2009-06-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lori227 的回复:]
包含了 AbstractThread.cpp文件吗~
[/Quote]
没有#include "AbstractThread.cpp"
.cpp文件也要在工程B中include吗?
谢谢!
ztenv 版主 2009-06-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 goodname 的回复:]
应该是缺少AbstractThread类的实现文件。
[/Quote]

AbstractThread.cpp已经在工程A中实现了,在工程A中继承AbstractThread类就可以正常运行,
ztenv 版主 2009-06-19
  • 打赏
  • 举报
回复
已解决了,谢谢各位!
当遇到这种问题时应该如何解决呢?
一个基类在一个工程文件中,我想在另一个工程中继承此基类,总不能每次都把基类的.h 、.cpp文件拷贝到我的派生类所在的工程中吧?
chenzhp 2009-06-19
  • 打赏
  • 举报
回复
你应该设计一个抽象类。里面全是纯虚函数。用一个类实现它。其余的类只需要继承抽象类就可以了。
arong1234 2009-06-19
  • 打赏
  • 举报
回复
你如果不想在每个工程中都包含那个抽象类的实现,你必须用纯抽象类,也就是除了纯虚函数之外,你不能定义任何其他函数
jhony_lee 2009-06-19
  • 打赏
  • 举报
回复
缺少实现文件
yixiao386 2009-06-19
  • 打赏
  • 举报
回复
抽象类的cpp呢
lori227 2009-06-19
  • 打赏
  • 举报
回复
包含了 AbstractThread.cpp文件吗~
goodname 2009-06-19
  • 打赏
  • 举报
回复
应该是缺少AbstractThread类的实现文件。
coverallwangp 2009-06-19
  • 打赏
  • 举报
回复
工程里面找不到AbstractThread,你讲AbstractThread文件加到工程B中

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧