15,471
社区成员
发帖
与我相关
我的任务
分享
void Pipe::loop(){
char outbuff[4096]; //输出缓冲
DWORD byteread;
this->setPipeOn(true);
while (true)
{
memset(outbuff, '\0', 4096);
if (ReadFile(this->hpiperead, outbuff, 4095, &byteread, NULL) == NULL)
{
this->setPipeOn(false);
break;
}
printf("%s", outbuff);
memset(outbuff, '\0', 4096);
}
this->setPipeOn(false);
std::cout << "Pipe Stoped!"<<endl;
}
void CCCSDlg::loop(void * lpvoid)
{
CCCSDlg *m_main = (CCCSDlg*)lpvoid;
char outbuff[4096]; //输出缓冲
DWORD byteread;
m_main->pipe->setPipeOn(true);
while (true)
{
memset(outbuff, '\0', 4096);
if (ReadFile(m_main->pipe->hpiperead, outbuff, 4095, &byteread, NULL) == NULL)
{
m_main->pipe->setPipeOn(false);
break;
}
m_main->SetEditOutStr(CString(outbuff));
}
m_main->pipe->setPipeOn(false);
m_main->SetEditOutStr(CString(outbuff));
memset(outbuff, '\0', 4096);
}
伪代码:CCCSDlg.h
#pragma once
#include "Pipe.h"
class Pipe;
class CCCSDlg : public CDialog
{
Pipe* pipe; //这里不会出问题了
}
虽然为什么要声明还是不太懂,但问题解决了伪代码:Pipe.h
#pragma once
#include "CCCSDlg.h"
class CCCSDlg;//忘了说,这里还要做一次CCCSDlg的声明,明明我已经包含#include "CCCSDlg.h"头文件了,怎么还要申明呢。
class Pipe
{
CCCSDlg * mian;
}
如果没有这个申明,也会出现语法错误: 缺少“;”(在“*”的前面)
伪代码:CCCSDlg.h
#pragma once
#include "Pipe.h"
class CCCSDlg : public CDialog
{
Pipe* pipe; //但是这里报错,错误原因 语法错误: 缺少“;”(在“*”的前面),指向了这一行……我想了半天,没想出来是什么原因
}
伪代码:Pipe.h
#pragma once
#include "Pipe.h"
class Pipe
{
CCCSDlg * mian;
}
但报错的原因虽然想不通,解决的办法依然是有的。
把Pipe* pipe;改成void* pipe;
然后cpp中,要使用的时候,做一个强制转换:
CCCSDlg.cpp中的实例片段:
pipe = new Pipe(Tmpch,this);
Pipe *m_Pipe = (Pipe*)pipe;
Pipe.cpp中的输出片段:
m_main->SetEditServerStr(_T("Pipe Stoped!"));
现在运行起来似乎没有问题……
可是原本为什么会报错。
我这样强制转换,是否有什么不清楚的隐患?