Clist中包含Clist的变量,无法初始化 “很有意思的一个题目” 大侠路过请留步,谢谢

最外层:typedef Clist MOUDLE;
structA{
type A;
...
MAC mac;
}
MAC的定义为:typedef Clist MAC;

在全局或局部定义MOUDLE md;时报错:
1>D:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\atlmfc\include\afxtempl.h(771): error C2248: “CObject::operator =”: 无法访问 private 成员(在“CObject”类中声明)
1> D:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\atlmfc\include\afx.h(535) : 参见“CObject::operator =”的声明
1> D:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\atlmfc\include\afx.h(509) : 参见“CObject”的声明
1> 此诊断出现在编译器生成的函数“CList &CList::operator =(const CList &)”中
1> with
1> [
1> TYPE=std::string,
1> ARG_TYPE=std::string &
1> ]

源码如下:

#include

using namespace std;
typedef CList< string, string&> lMac;
typedef struct MOUDLE
{
string name;
lMac lMac1;
int n_Count;
int max_Count;
int version;
public:
void operator= (MOUDLE& m)
{
name = m.name;
lMac1 = m.lMac1;
n_Count = m.n_Count;
max_Count = m.max_Count;
version = m.version;
}
}MOUDLE;
typedef CList L_MOUDLE;
L_MOUDLE mou;

1个回答

lMac1 = m.lMac1;//这句是不可以的。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
MFC 子窗口listcontrol 控件初始化不显示
主窗口 button 按键创建了一个模态对话框,OnButtonO是按键消息函数 void CMyKmodeTestDlg::OnButtonO() { CClusterDlg dlg; dlg.DoModal(); } CClusterDlg是已经建好的子窗口类,现在子窗口上添加了3个listcontrol控件,并关联了变量 在子窗口cpp文件中初始化listcontrol 控件,建立表头 ,编译没有问题,运行出来没有显示 DDX_Control(pDX, IDC_LIST_C1, m_cList1); DDX_Control(pDX, IDC_LIST_C2, m_cList2); DDX_Control(pDX, IDC_LIST_C3, m_cList3); BOOL CClusterDlg::OnInitDialog() { CDialog::OnInitDialog(); // TODO: 在此添加额外的初始化 m_cList1.ModifyStyle(LVS_TYPEMASK,LVS_REPORT); m_cList1.InsertColumn(0, _T("第一列"), LVCFMT_LEFT, 120); //宽度120 m_cList1.InsertColumn(1, _T("第二列"), LVCFMT_LEFT, 120); m_cList1.InsertColumn(2, _T("第三列"), LVCFMT_LEFT, 120); m_cList1.InsertColumn(3, _T("第4列"), LVCFMT_LEFT, 120); m_cList1.InsertColumn(4, _T("第5列"), LVCFMT_LEFT, 120); return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE } ``` ```
MFC CList序列化问题 非预期的文件格式
编一个类似数据库的程序 自己定义了一个CInfoTable类,里面有一个CList的容器存储一组我自己定义的另一个类CPlayer, 而CPlayer类中又包含一个CList容器。但在写完序列化函数后,打开文件会报错非预期的文件格式。 public: CList<Record,Record> Rectab; int m_count; void RecordTable::Serialize(CArchive &ar) { if (ar.IsStoring()) { // TODO: add storing code here ar<<m_count; POSITION pos = Rectab.GetHeadPosition(); while(pos!=NULL) { (Rectab.GetAt(pos)).Serialize(ar); Rectab.GetNext(pos); } } else { // TODO: add loading code here if(m_count>0) { for(int i=0;i<m_count;i++) { Rectab.RemoveTail(); } } ar>> m_count; for(int i=0; i<m_count; i++) { Record table; table.Serialize(ar); Rectab.AddTail(table); } } } 当将上面函数去掉成: void RecordTable::Serialize(CArchive &ar) { if (ar.IsStoring()) { // TODO: add storing code here ar<<m_count; } } else { // TODO: add loading code here ar>> m_count; } } }就不会报出上面的错误 但CList 部分未完成序列化 求教应当怎么改(PS:Record类的序列化不存在问题)
求mfc中多线程中通过CLIST传值的用法。。
自己在编一个mfc多线程程序。 如T1想把数据放到一个队列中 T2从这个队列中读取数据,处理数据后把数据保存到队列2中 T3再从队列2中读取数据使用 求帮忙,想实现这个功能是创建队列好还是用clist好。最好有代码实例。谢谢
Mybtias 发现极度尴尬的事情,实体类中嵌套一个实体类,嵌套的实体类再嵌套一个实体类数组,似乎无法用association 和 collection 依次表达,返回列会只有一个
RT. 当实体类存在这种格式 ``` class A{ B b }; class B{ List<C> cList}; ``` 的时候, myabtis在使用 resultMap 时,由于要顾及层级关系,第一个A中嵌套的B,则应该是使用 association 表达关系,第二个则用 collection 表达关系。 这时候神奇的事情出现了,当返回数据是多条时(其sql语句在mysql中使用返回6条)但是由于使用了 association , 其后使用的啃爹的 collection 则只返回一条数据了。 尝试解决方法: 1. 删除 association 相关项,让它自动寻找,结果系统报错,找不到 cList 这个东东,此解决宣告告破 2. 将association改为collection,但是由于第一个collection实际上时只有一个的,照样是返回了1条数据,而实际上却需要返回6条数据 贴一下相关mapper格式 ``` <resultMap id="aMap" type="...A"> <id property="id" column="id"/> <association property="b" javaType="...B"> ... <collection property="cList" ofType="...C"> ... </collection> </association> </resultMap> ``` 3. 由此我在尝试了多个方法之后,实在没办法只能采用偷梁换柱的方法,将cList的数据嵌套在A中,然后返回6个数据给外层的cList,然后再将外层的cList = 内层的 cList,然后外层的cList再置空 4. 虽然通过小滑头方式解决了,但是我依旧不甘心,我这种偷梁换柱就是对仅学到的知识进行一次重复处理,在效率上肯定要差于一步处理的方法的,不知道有没有大哥能直接处理这种数据格式的形式用mybatis的相关resultMap一步到位?谢谢相关大哥了,大家也可以一起讨论,这种问题可能还有其它处理方法
clist调用find函数之后调用removeat函数出错
``void CClistDlg::OnBnClickedButton3() { // TODO: 在此添加控件通知处理程序代码 CList<CPoint3d, CPoint3d&> point3d; for (int i = 0; i < 10; i++) { point3d.AddTail(CPoint3d( i*100,i*10,i)); } m_edit_text.Empty(); //POSITION pos = point3d.Find(CPoint3d(100,10,1)); //clist调用find时需要在clist头文件中写上运算符重载 //point3d.RemoveAt(pos); CString s; POSITION pos1 = point3d.GetHeadPosition(); for (int i = 0; i < 10; i++) { CPoint3d point = point3d.GetNext(pos1); s.Format(_T("x=%d,\ty=%d,\tz=%d"), point.x, point.y,point.z); m_edit_text.Append(s); m_edit_text.Append(_T("\r\n")); } UpdateData(false); } ` ``` #pragma once class CPoint3d { public: int x, y, z = 0; CPoint3d() { }; CPoint3d(int xpos,int ypos,int zpos) { x = xpos; y = ypos; z = zpos; }; bool operator==(CPoint3d point)const { return (x == point.x&&y == point.y&&z == point.z); } }; ``` ![图片说明](https://img-ask.csdn.net/upload/201908/15/1565872579_818838.png) 如图所示,如果在代码中 //POSITION pos = point3d.Find(CPoint3d(100,10,1)); //clist调用find时需要在clist头文件中写上运算符重载 //point3d.RemoveAt(pos);不屏蔽这两行就会报错,求大佬解释下原因 貌似并不是没检索到的问题 point3d.SetAt(pos,CPoint3d(999,99,9));如果使用setat函数则不会报错,并且程序执行正常
MFC中用Clist列表框的控件来显示数据库的问题
各位高手大神,你们好: 我现在有一个问题:利用ADO读取一个文件(其实本质上是ACCSESS数据库),但是在读取的过程中,比如通过判断“状态”这个字段的值(其实这个字段只保存了两个不同的字符,不是‘E’就是‘N’),来决定这一行(不是一个单元格)显示的背景颜色,这个功能如何实现? 通过消息NM-CUSTOMDRAW? 本人菜鸟一个,不知道有没有说清楚,希望水平高的程序员帮我解解惑,不胜感激! 贴上部分代码: 在类内最开始的位置定义了一个全局变量 int型的flag=1,读取数据库的代码如下 while(!m_pRecordset->adoEOF) { m_Grid.InsertItem(0,""); CString str= (char*)(_bstr_t)m_pRecordset->GetCollect("valid"); if("E"==str) { str="有效"; flag=1; } else { str="无效"; flag=0; } m_Grid.SetItemText(0,0,str);//设置无效和有效 } 消息响应函数的代码如下: void CDBDlg::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult) { NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR ); // Take the default processing unless we set this to something else below. *pResult = 0; // First thing - check the draw stage. If it's the control's prepaint // stage, then tell Windows we want messages for every item. if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage ) { *pResult = CDRF_NOTIFYITEMDRAW; } else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage ) { switch (flag) { case 0: //MessageBox("3"); pLVCD->clrTextBk=RGB(0,0,100); pLVCD->clrText=RGB(100,0,0); break; case 1: // MessageBox("2"); pLVCD->clrTextBk=RGB(100,0,0); pLVCD->clrText=RGB(0,100,0); break; } *pResult = CDRF_DODEFAULT; } } 代码运行的结果显示flag恒为1,不知道为什么
MFC中的CListBox控件的不显示
CListBox *cList = (CListBox *)GetDlgItem(IDC_LIST_FONT); cList->AddString("123"); cList->AddString("粗体BOLD"); cList->AddString("斜体ITALIC"); cList->AddString("粗斜体BOLDITALIC"); 但是运行后,仍不显示 但他实际上是有东西的,通过下面代码,可得到实际内容,就是不知道为什么不会直接显示出来,如下面截图点击会显示在最上方的文本框中 void dialogLearn::OnSelchangeListFont() { // TODO: 在此添加控件通知处理程序代码 CListBox *cList = (CListBox *)GetDlgItem(IDC_LIST_FONT); int count = cList->GetCount(); int cur = cList->GetCurSel(); CString msg = "你选择了"; CString res = ""; if (cur >= 0) { cList->GetText(cur, res); msg += res; } else { msg = "列表框中什么都没有选"; } SetDlgItemText(IDC_EDIT_MSG, msg); } ![图片说明](https://img-ask.csdn.net/upload/201512/25/1451054672_860186.png) ![图片说明](https://img-ask.csdn.net/upload/201512/25/1451054684_133506.png) ``` ```
VS2017 MFC 如何调用其他类的ListCtrl信息?
因工作需要自学MFC,目前我在A类里建了一个ListCtrl控件,创建控件变量为m_ListCtrl,然后我需要在B类里获取这个控件的信息。第一次我想在B类里创建个实例对象,但是取不到信息。第二次想将m_ListCtrl这个变量作为参数传到B类,但是提示:“无法引用 函数 "CListCtrl::CListCtrl(const CListCtrl &)" (已隐式声明) -- 它是已删除的函数”。第三次我想在A类将控件里的内容放到CStringList里,但是返回值还是提示已被删除。看网上说用什么引用,但是没太搞懂。所以写了这段 ``` CStringList* CStuInfoManag::GetListInfo() { int iColumnNum, iRowCount, i, j; CString strText; CStringList cList; cList.RemoveAll(); cList. iColumnNum = m_ListCtrl.GetHeaderCtrl()->GetItemCount(); iRowCount = m_ListCtrl.GetItemCount(); for (i = 0; i < iColumnNum; i++) { for (j = 0; j < iRowCount; j++) { strText = m_ListCtrl.GetItemText(j,i); cList.AddTail(strText); } } return &cList; } ``` 这样提示错误为:class "CStringList" 没有成员 "iColumnNum"。 以上是我的尝试方法,我该如何在B类里取得A类ListCtrl的信息?
struts2 jsp页面给action实体赋值
实体A中有实体B的List对象 List<B> bLlist 实体B中有实体C的List对象 List<C> cList 我想在jsp中通过A.bList[0].cList[0].属性 A.bList[0].cList[1].属性 给cList赋值~~~ 可是到action中cList的长度一直是0 没赋上值.... 想请教一下可能是什么原因.... 各个属性名都是对的 搜了好几遍..SOS~~~.
【Java】有什么简便的写法,快速找到当前实体列表是否包含某个值?
如下 ``` List<User> cList; ``` User类中有个name属性和code属性 假设list中有100个不同的对象 我现在有个string是“小明” 怎么简便的写,来判断list中是否有对象的name属性是“小明”
程序运行后txt文本出现乱
程序运行后文本文件出现乱码,四个warning是相同的问题, 看了很多帖子但都没有相关的详细回答 请问这种情况该如何解决 ![图片说明](https://img-ask.csdn.net/upload/201912/12/1576134842_865518.png) ![图片说明](https://img-ask.csdn.net/upload/201912/12/1576134945_774123.png) ![图片说明](https://img-ask.csdn.net/upload/201912/12/1576135365_278865.png) ``` #include<iostream> #include<string.h> #include<iomanip> #include<fstream> #include<stdio.h> #include <stdlib.h> using namespace std; int count=0; class CData //定义数据基类 { public: CData(){}; virtual int Compare(CData &)=0; virtual void Show()=0; virtual ~CData(){}; }; class CNode //定义结点基类 { private: CData *pData; //用于指向数据类的指针 CNode *pNext; //用于指向链表的后向指针 public: void InputData(CData *pdata){pData=pdata;} //输入数据 void ShowNode(){pData->Show();} //打印一个节点的数据 CData *GetData(){return pData;} friend class CList; //定义链表类为基类 }; class CList { CNode *pHead; //链表头结点指针 public: CList(){pHead=0;}; ~CList(){DeleteList();} void AddNode(CNode *pnode); //在首部添加结点 CNode *DeleteNode(CNode *); //删除一个指定的结点,返回该结点的指针 CNode *Search(CData &); //查找一个指定的数据,返回该数据所在的结点在链表的指针,未找到返回0 bool IsExist(CData &); void ShowList(); //打印整个链表 void DeleteList(); //删除整个链表 CNode *GetListHead(){return pHead;} //返回链表首结点 CNode *GetListNextNode(CNode *pnode); //返回链表指定结点的下一个结点 }; CNode *CList::GetListNextNode(CNode *pnode) //返回链表指定结点的下一个结点 { CNode *p1=pnode; return p1->pNext; }; void CList::AddNode(CNode *pnode) //在首部添加结点 { if (pHead==0) //如果是空链表,插入的结点是唯一的结点 { pHead=pnode; pnode->pNext=0; return; } else //否则,插入到链表首部 { pnode->pNext=pHead; pHead=pnode; } }; CNode *CList::DeleteNode(CNode *pnode) //删除一个指定的结点,返回该结点的指针 { CNode *p1,*p2; p1=pHead; //指向首结点 while(p1!=pnode&&p1->pNext!=0) //寻找要删除的结点 { p2=p1; p1=p1->pNext; //结点p2始终在p1的后面 } if (p1==pHead) //如果要删除的是首结点 { pHead=pHead->pNext; //将首结点后移 return pnode; } p2->pNext=p1->pNext; //p1指向被删除的结点,将p2结点与p1后面的结点连接起来 return pnode; } CNode *CList::Search(CData &data) //查找一个指定的数据,返回指针,若未找到返回0 { CNode *p1=pHead; while(p1) //从头结点开始查找 { if (p1->pData->Compare(data)==0) return p1; //找到后返回结点指针 p1=p1->pNext; } return 0; //搜索完找不到,返回空指针0 } void CList::ShowList() //打印整个链表 { CNode *p1=pHead; while(p1) { p1->pData->Show(); p1=p1->pNext; } } void CList::DeleteList() //删除整个链表结点 { CNode *p1,*p2; p1=pHead; while(p1) { delete p1->pData; p2=p1; p1=p1->pNext; delete p2; } } class Repository:public CData //库存为记录,为数据基类的公有派生类 { private : char szName[20]; //库存中数据:商品名、商品数量和入库价格 unsigned int szNumber; char szPrice[20]; char szN; CList ShList; public: Repository(); //构造函数 Repository(char *name,int number,char *price); void SetRecord(char *name, int number,char *price); //输入数据函数 int Compare(CData &); //比较函数,比较商品名 void Show(); void AddRecord(); void Display(); void LookUpRecord(); void DeleteRecord(); void ModifyRecord(); void SaveToFile(); void Operate(string &strChoice); void ReadFromFile(); void Output(); }; Repository::Repository() { strcpy(szName,"\0"); szNumber=0; strcpy(szPrice,"\0"); } Repository::Repository(char *name,int number,char *price) { strcpy(szName,name); szNumber=number; strcpy(szPrice,price); szN=name[0]; } void Repository::SetRecord(char *name, int number,char *price) //输入数据函数 { strcpy(szName,name); szNumber=number; strcpy(szPrice,price); szN=name[0]; } int Repository::Compare(CData &data) //比较商品名 { Repository &temp=(Repository &)data; return strcmp(szName,temp.szName); } void Repository::Show() //打印一个结点的数据 { cout<<setw(15)<<szName<<setw(15)<<szNumber<<setw(15)<<szPrice<<endl; } void Repository::AddRecord() //将记录添加到链表中 { CNode *pNode; Repository *pSh; char szName[20],szPrice[20]; unsigned int szNumber; cout<<"请输入新商品名(输入0退出,并进入系统菜单):"; cin>>szName; while(strcmp(szName,"0")) { cout<<"请输入新商品入库价格: "; cin>>szPrice; cout<<"请输入新商品数量: "; cin>>szNumber; pSh=new Repository; //生成新的数据累对象 pSh->SetRecord(szName,szNumber,szPrice); //数据类对象赋值 pNode=new CNode; //生成新的结点 pNode->InputData(pSh); //结点插入链表 ShList.AddNode(pNode); count++; cout<<"请输入新商品名(输入0退出,并进入系统菜单) "; cin>>szName; } cout<<endl<<endl; } void Repository::Display() //显示全部链表数据 { cout<<"当前操作共有"<<count<<"条新商品的添加纪录。\n\n"; cout<<"目前库存共有商品信息记录是:\n\n"; cout<<setiosflags(ios_base::left)<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库价格"<<endl<<endl; ShList.ShowList(); cout<<endl<<endl; system("pause"); system("cls"); } void Repository::LookUpRecord() // 按照商品名查找 { CNode *pLook; char szName[20]; cout<<"请输入您需要查找的商品名(输入0退出,并进入系统菜单):"; cin>>szName; while (strcmp(szName,"0")) { Repository sh(szName,0,"0"); //生成结点 pLook=ShList.Search(sh); //查找指定结点的数据 if (pLook) { cout<<"在库存商品信息记录中找到商品:"<<szName<<",内容是:"<<endl; cout<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库价格"<<endl; pLook->ShowNode(); } else cout<<"在库存商品信息记录中找不到商品:"<<szName<<"。"<<endl; cout<<"请输入您需要查找的商品名(输入0退出,并进入系统菜单):"; cin>>szName; } cout<<endl<<endl; } void Repository::DeleteRecord() //在链表中删除指定的结点的数据 { CNode *pLook; char szName[20]; cout<<"请输入您需要删除的商品名(输入0退出,并进入系统菜单):"; cin>>szName; while(strcmp(szName,"0")) { Repository sh(szName,0,"0"); pLook=ShList.Search(sh); if (pLook) //删除时应先查找出结点 { cout<<"在库存商品信息记录中找到商品:"<<szName<<",内容是:"<<endl; cout<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库价格"<<endl; pLook->ShowNode(); cout<<"请确定是否删除此商品信息记录(Y/N)【确定删除请输入Y或y,取消删除请输入N或n】:"; char ok; cin>>ok; if (ok=='Y'||ok=='y') { ShList.DeleteNode(pLook); cout<<szName<<"的信息记录删除成功!"<<endl; delete pLook; count--; } else if(ok=='N'||ok=='n') cout<<szName<<"的信息记录删除失败!"<<endl; } else cout<<"在库存商品信息记录中找不到商品:"<<szName<<"。"<<endl; cout<<"请输入您需要删除的商品名(输入0退出,并进入系统菜单):"; cin>>szName; } cout<<endl<<endl; } void Repository::ModifyRecord() //修改商品记录 { CNode *pLook; Repository *pSh; char szName[20],szPrice[20]; unsigned int szNumber; cout<<"请输入您需要修改的商品名(输入0退出,并进入系统菜单):"; cin>>szName; while(strcmp(szName,"0")) { Repository sh(szName,0,"0"); pLook=ShList.Search(sh); if (pLook) //修改时应先查找出结点 { cout<<"在库存商品信息记录中找到商品:"<<szName<<",内容是:"<<endl; cout<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库价格"<<endl; pLook->ShowNode(); cout<<"-----下面开始修改-----"<<endl<<"请输入修改后的商品名: "; cin>>szName; cout<<"请输入修改后的商品数量:"; cin>>szNumber; cout<<"请输入修改后的商品入库价格: "; cin>>szPrice; cout<<"请确定是否修改此记录(Yes (Y) or No(N)):"; char ok; cin>>ok; if (ok=='Y'||ok=='y') { pSh=new Repository; pSh->SetRecord(szName,szNumber,szPrice); pLook->InputData(pSh); cout<<szName<<"的信息记录修改成功!"<<endl; } else if(ok=='N'||ok=='n') cout<<szName<<"的信息记录修改失败!"<<endl; } else cout<<" 在库存商品信息记录中找不到"<<szName<<","<<endl; cout<<" 请输入您需要修改的商品名(输入0退出,并进入系统菜单):"; cin>>szName; } } void Repository::Output() { CNode *pLook; Repository *pSh; char szName[20]; unsigned int szNumber; cout<<"请输入您需要出库的商品名(输入0退出,并进入系统菜单):"; cin>>szName; while(strcmp(szName,"0")) { Repository sh(szName,0,"0"); pLook=ShList.Search(sh); if (pLook) //修改时应先查找出结点 { pSh=(Repository *)pLook->GetData(); cout<<"在库存商品信息记录中找到商品:"<<szName<<",内容是:"<<endl; cout<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库价格"<<endl; pLook->ShowNode(); if (0==pSh->szNumber) { cout<<"该商品缺货,请及时补充!"<<endl; } else { cout<<"请输入您要取出的商品数量:"; cin>>szNumber; cout<<"请确定是否取出该商品( Yes (Y) or No(N) ):"; char ok; cin>>ok; if(ok=='Y'||ok=='y') { if(pSh->szNumber<=szNumber) { cout<<szName<<"您要求的商品数量大于仓库中的数量,故全部输出"<<pSh->szNumber<<" 个商品"<<endl; pSh->szNumber=0; } else { pSh->szNumber-=szNumber; cout<<szName<<"您已取出 "<<szNumber<<" 个商品"<<endl; } cout<<szName<<"成功取出!"<<endl; } else if(ok=='N'||ok=='n') cout<<szName<<"您取消了该操作"<<endl; } } else cout<<" 在库存商品信息记录中找不到"<<szName<<","<<endl; cout<<" 请输入您需要出库的商品名(输入0退出,并进入系统菜单):"; cin>>szName; } } void Repository::SaveToFile() //将链表中的数据保存在文件中 { ofstream outfile("repository.txt",ios::binary); if(! outfile) { cout<<"数据文件打开错误,没有将数据存入文件!\n"; return; } CNode *pnode; Repository *pSh; string strName,strNumber; pnode=ShList.GetListHead(); //取出链表首结点指针 while(pnode) { pSh=(Repository *)pnode->GetData(); //返回结点指向的数据域指针 outfile.write((char *)pSh,sizeof(Repository)); //将数据域写入文件 pnode=ShList.GetListNextNode(pnode); // 取下一结点的指针 } outfile.close(); } void Repository::ReadFromFile() //在程序开始先查找有无数据文件,找到后读取文件数据 { ifstream infile("repository.txt",ios::binary); if(! infile) { cout<<"没有数据文件,请您先添加!\n\n"; return; } CNode *pNode; Repository *pSh; while(! infile.eof()) { pSh=new Repository; //定义数据域对象 infile.read((char *)pSh,sizeof(Repository)); pNode=new CNode; pNode->InputData(pSh); //数据域对象内容生成结点 ShList.AddNode(pNode); //将结点加入链表 } ShList.DeleteNode(pNode); //由于文件多读一次,所以将首结点删除 infile.close(); } void Repository::Operate(string &strChoice) //根据主菜单选项进行操作 { if (strChoice=="1") AddRecord(); else if (strChoice=="2") Display(); else if (strChoice=="3") LookUpRecord(); else if (strChoice=="4") DeleteRecord(); else if(strChoice=="5") ModifyRecord(); else if(strChoice=="6") Output(); else if (strChoice=="0") SaveToFile(); else cout<<"对不起,您的输入有误,请重新输入您的选择: "; } int main() { Repository repository; cout<<"*******************************************************************\n\n"; cout<<" 欢迎进入库存管理系统 \n\n"; cout<<"*******************************************************************\n\n"; repository.ReadFromFile(); //从文件中输入数据 string strChoice; //接受主菜单选项 do { cout<<"【欢迎进入系统菜单】:\n\n\n"; cout<<" <1>.添加新商品信息记录\n\n"; cout<<" <2>.显示库存中商品信息记录内容\n\n"; cout<<" <3>.根据商品名查询库存中商品信息记录\n\n"; cout<<" <4>.根据商品名删除库存中商品信息记录\n\n"; cout<<" <5>.根据商品名修改库存中商品信息记录\n\n"; cout<<" <6>.商品出库\n\n"; cout<<" <0>.退出系统\n\n\n"; cout<<"【请输入您的选择】:"; cin>>strChoice; system("cls"); repository.Operate(strChoice); }while(strChoice!="0"); cout<<"***********************************************************************\n\n"; cout<<" ------------******欢迎再次使用库存管理系统******---------- \n\n"; cout<<"***********************************************************************\n\n"; system("pause"); } ```
广告列表积分大小排序
举例: 我想在一个列表里添加两个积分墙广告列表A和B, 现在需要对A和B里面的列表广告进行排序,积分高的就排在前面,积分低的就排在后面,我现在的思路是将A和B添加到一个大列表C里,然后对C整个排序,但是具体不知道怎么写了,因为我是根据积分列表里面对象的积分值字段进行比较大小的,有点搞不懂,不会写了,下面是我们的代码案例,求大神帮忙看看 List<BaseResource> alist = new ArrayList<BaseResource>(); List<BaseResource> blist = new ArrayList<BaseResource>(); List<BaseResource> clist = new ArrayList<BaseResource>(); clist .addAll(alist); clist .addAll(blist ); 现在对clist 进行排序: for (int i = 0; i < clist .size(); i++) { for (int j = i + 1; j < clist .size(); j++) { BaseResource br_1 = clist .get(i); //getPoint是获取结合对象列表的积分大小的 gerPoint(),说明在下面~ int data1 = getPoint(br_1); BaseResource br_2 = clist .get(j); int data2 = getPoint(br_2); //对积分point大小进行比较 if (data1 < data2) { ------------ 这里写不下去了----------- } } } private int getPoint(BaseResource br) { if (br.dataType == A_DataType) { ConnerObject connerObject= (ConnerObject) br.object; //返回A广告的分值大小 return aconnerObject.getPoints(); } else if (br.dataType == B_DataType) { Map<String, Object> map = (Map<String, Object>) br.object; //返回B广告的分值大小 return (Integer) map.get("number"); } return 0; }
boost reg match的问题,很奇怪,不知道怎么弄
//CList<boost::smatch,boost::smatch&> Q_Regex::QRegexList(std::string htmlcode,CString RegStr) //{ //提取子串 // boost::smatch mat; // boost::regex reg(RegStr); // bool r=boost::regex_match(htmlcode, mat, reg); // CList<boost::match_results<std::string::const_iterator>,boost::match_results<std::string::const_iterator>&> clist; // if(r) //如果匹配成功 // { // //显示所有子串 // // for (int i = 0; i < mat.size(); i ++) // clist.AddTail(mat[i]); // } // // // return clist; // //} clist.AddTail(mat[i]);这里提示类型不对,不知道mat怎么转sub_match,或者用其他什么方法
c++与C语言混合使用下,我想获得这样一个链表
c++与C语言混合使用下,我想通过输入获得char*字符串的一个链表,但是如下代码构建的链表始终是空字符,这是为什么呢? char* str = (char*)malloc(30); list<char*> clist; cout<<"输入list的字符串: "<<endl; while(cin>>str) { cout<<str<<endl; clist.push_back(str); } ​free(str);cin.clear();
C语言使用头插法简历双向链表,并实现对称输出
//比如输入的是abcd,输出应该是dcbabcd #include <stdio.h> #include <stdlib.h> struct Clist{ char data; struct Clist *next; struct Clist *pre; }; typedef struct Clist *List; void create(List &L){ L = (Clist*)malloc(sizeof(Clist)); L->next = NULL; L->pre = NULL; char ch; for(int i = 0;i<4;++i){ scanf("%c",&ch); Clist *q = (Clist*)malloc(sizeof(Clist)); q->data = ch; q->next = L->next; L->next->pre = q; L->next = q; q->pre = L; } } void print(List &L){ Clist *s = L->next; while(s->next){ printf("%c ",s->data); s=s->next; } while(s->pre){ printf("%c ",s->data); s=s->pre; } } int main(){ Clist *head; create(head); print(head); }
Vue 中的三级联动问题?
<select > <option>---请选择---</option> <option v-for="(p,i) in pList" :key="i">{{a.name}}</option> </select> .... const addressApp = new Vue({ .... data:{ pList:[],//省列表 cList:[],//市列表 aList:[]//区列表 } .... }); 备注:aList是后台异步请求获取的值, 格式为:[ {name:"河北省",provinceId:"1001"}, {name:"河南省",provinceId:"1002"}, ... ] 需求: 当选中下拉框中的某个选项时,如何获取这个选项的provinceId,通过什么事件 并向后台发起一个异步的请求,通过provinceId,获取城市的列表 (option绑定单击事件并传递对象无法触发!)
vue数组中检查相同的数据合并
![图片说明](https://img-ask.csdn.net/upload/201909/27/1569567291_372909.jpg) ![图片说明](https://img-ask.csdn.net/upload/201909/27/1569568471_500246.png) 类似以下 var cList =[ {id:0,name:"ssd",p:"1",pName:"老王"}, {id:1,name:"dds",p:"1",pName:"老王"}, {id:2,name:"eed",p:"1",pName:"老王"}, {id:3,name:"fdp",p:"1",pName:"老王"}, {id:4,name:"sad",p:"1",pName:"老王"}, {id:5,name:"jgg",p:"1",pName:"老王"}, {id:6,name:"lop",p:"1",pName:"老王"} ] <option v-for="c in cList" :value="c.p">{{c.pName}}</option>
为何爬取不了淘宝的数据?
``` import requests import re def getHTMLtext(url): try: r = requests.get(url, timeout = 30) r.raise_for_status() r.encoding = r.apparent_encoding return r.text except: return ' ' def parsePage(clist, html): try: plt = re.findall(r'\'view_price\'\:\'[\d\.]*\' ' ,html) tlt = re.findall(r'\'raw_title\'\:\'.*?\' ' ,html) for i in range(len(plt)): price = eval(plt[i].split(':')[1]) title = eval(tlt[i].split(':')[1]) clist.append([price, title]) except: print('') print(clist) def printGoodslist(clist): tplt = '{:4}\t{:10}\t{:16}' print(tplt.format('序号','价格','商品名称')) count = 0 for c in clist: count += 1 print(tplt.format(count, c[0], c[1])) def main(): goods = '书包' depth = 2 start_url = 'https://s.taobao.com/search?q=' + goods infolist = [] for i in range(depth): try: url = start_url + '&s=' + str(44*i) html = getHTMLtext(url) parsePage(infolist, html) except: continue printGoodslist(infolist) main() ``` 打印出来其中的clist列表是空的,是不是正则表达式写错了?
'typedef ' : ignored on left of 'class CStringList' when no variable is declared
//CListTest.cpp:Define the entry point for the console application //#include"stdafx.h" #include<afxtempl.h> #include<iostream> #include<string> using namespace std; typedef CStringList<string,string&>StringList; //实现一个以String为元素的数组类 //入参和出参都是一个指向string的指针 int main()//(int argc,_TCHAR* argv[]) { const CString str[]={ _T("1st Score"), _T("2nd Score"), _T("3rd Score"), _T("4th Score"), }; CStringList list1; size_t i=0; //从链表头部向链表中添加记录 for(i=0;i<sizeof(str)/sizeof(CString);i++) { list1.AddHead(str[i]); } CString string; while(!list1.IsEmpty()) { string=list1.RemoveHead(); wcout<<LPCTSTR(string)<<endl; //最好每次清空string string.ReleaseBuffer(); } cout<<endl; return 0; } //程序代码如上,本来预计应输出: /*4th Score 3rd Score 2nd Score 1st Score*/ // 但却显示错误为: //D:\Visual C++ Project\CList_P96\CList.cpp(9) : warning C4091: 'typedef ' : ignored on left of 'class CStringList' when no variable is declared //D:\Visual C++ Project\CList_P96\CList.cpp(9) : error C2143: syntax error : missing ';' before '<' //D:\Visual C++ Project\CList_P96\CList.cpp(9) : error C2143: syntax error : missing ';' before '<'
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私...
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小人工智障。 思路可以运用在不同地方,主要介绍的是思路。
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
阿里面试官问我:如何设计秒杀系统?我的回答让他比起大拇指
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图和个人联系方式,欢迎Star和指教 前言 Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸,打败了...
C语言魔塔游戏
很早就很想写这个,今天终于写完了。 游戏截图: 编译环境: VS2017 游戏需要一些图片,如果有想要的或者对游戏有什么看法的可以加我的QQ 2985486630 讨论,如果暂时没有回应,可以在博客下方留言,到时候我会看到。 下面我来介绍一下游戏的主要功能和实现方式 首先是玩家的定义,使用结构体,这个名字是可以自己改变的 struct gamerole { char n...
面试官问我:什么是消息队列?什么场景需要他?用了会出现什么问题?
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸...
Android性能优化(4):UI渲染机制以及优化
文章目录1. 渲染机制分析1.1 渲染机制1.2 卡顿现象1.3 内存抖动2. 渲染优化方式2.1 过度绘制优化2.1.1 Show GPU overdraw2.1.2 Profile GPU Rendering2.2 卡顿优化2.2.1 SysTrace2.2.2 TraceView 在从Android 6.0源码的角度剖析View的绘制原理一文中,我们了解到View的绘制流程有三个步骤,即m...
微服务中的Kafka与Micronaut
今天,我们将通过Apache Kafka主题构建一些彼此异步通信的微服务。我们使用Micronaut框架,它为与Kafka集成提供专门的库。让我们简要介绍一下示例系统的体系结构。我们有四个微型服务:订单服务,行程服务,司机服务和乘客服务。这些应用程序的实现非常简单。它们都有内存存储,并连接到同一个Kafka实例。 我们系统的主要目标是为客户安排行程。订单服务应用程序还充当网关。它接收来自客户的请求...
致 Python 初学者们!
作者| 许向武 责编 | 屠敏 出品 | CSDN 博客 前言 在 Python 进阶的过程中,相信很多同学应该大致上学习了很多 Python 的基础知识,也正在努力成长。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 Python 这门编程语言,从2009年开始单一使用 Python 应对所有的开发工作,直至今...
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观...
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外...
字节跳动面试官这样问消息队列:分布式事务、重复消费、顺序消费,我整理了一下
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip installselenium -ihttps://pypi.tuna.tsinghua.edu.cn/simple/ ...
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca...
SpringBoot2.x系列教程(三十六)SpringBoot之Tomcat配置
Spring Boot默认内嵌的Tomcat为Servlet容器,关于Tomcat的所有属性都在ServerProperties配置类中。同时,也可以实现一些接口来自定义内嵌Servlet容器和内嵌Tomcat等的配置。 关于此配置,网络上有大量的资料,但都是基于SpringBoot1.5.x版本,并不适合当前最新版本。本文将带大家了解一下最新版本的使用。 ServerProperties的部分源...
Python绘图,圣诞树,花,爱心 | Turtle篇
每周每日,分享Python实战代码,入门资料,进阶资料,基础语法,爬虫,数据分析,web网站,机器学习,深度学习等等。 公众号回复【进群】沟通交流吧,QQ扫码进群学习吧 微信群 QQ群 1.画圣诞树 import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle()...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东...
破14亿,Python分析我国存在哪些人口危机!
一、背景 二、爬取数据 三、数据分析 1、总人口 2、男女人口比例 3、人口城镇化 4、人口增长率 5、人口老化(抚养比) 6、各省人口 7、世界人口 四、遇到的问题 遇到的问题 1、数据分页,需要获取从1949-2018年数据,观察到有近20年参数:LAST20,由此推测获取近70年的参数可设置为:LAST70 2、2019年数据没有放上去,可以手动添加上去 3、将数据进行 行列转换 4、列名...
听说想当黑客的都玩过这个Monyer游戏(1~14攻略)
第零关 进入传送门开始第0关(游戏链接) 请点击链接进入第1关: 连接在左边→ ←连接在右边 看不到啊。。。。(只能看到一堆大佬做完的留名,也能看到菜鸡的我,在后面~~) 直接fn+f12吧 &lt;span&gt;连接在左边→&lt;/span&gt; &lt;a href="first.php"&gt;&lt;/a&gt; &lt;span&gt;←连接在右边&lt;/span&gt; o...
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ...... ...
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。 再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。 下文是原回答,希望能对你能有所启发。 如果我说,这个世界上人真的分三六九等,...
2020年全新Java学习路线图,含配套视频,学完即为中级Java程序员!!
新的一年来临,突如其来的疫情打破了平静的生活! 在家的你是否很无聊,如果无聊就来学习吧! 世上只有一种投资只赚不赔,那就是学习!!! 传智播客于2020年升级了Java学习线路图,硬核升级,免费放送! 学完你就是中级程序员,能更快一步找到工作! 一、Java基础 JavaSE基础是Java中级程序员的起点,是帮助你从小白到懂得编程的必经之路。 在Java基础板块中有6个子模块的学...
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合...
爬取薅羊毛网站百度云资源
这是疫情期间无聊做的爬虫, 去获取暂时用不上的教程 import threading import time import pandas as pd import requests import re from threading import Thread, Lock # import urllib.request as request # req=urllib.request.Requ...
如何优雅地打印一个Java对象?
你好呀,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员。虽然已经写了十多年的 Java 代码,但仍然觉得自己是个菜鸟(请允许我惭愧一下)。 在一个月黑风高的夜晚,我思前想后,觉得再也不能这么蹉跎下去了。于是痛下决心,准备通过输出的方式倒逼输入,以此来修炼自己的内功,从而进阶成为一名真正意义上的大神。与此同时,希望这些文章能够帮助到更多的读者,让大家在学习的路上不再寂寞、空虚和冷。 ...
雷火神山直播超两亿,Web播放器事件监听是怎么实现的?
Web播放器解决了在手机浏览器和PC浏览器上播放音视频数据的问题,让视音频内容可以不依赖用户安装App,就能进行播放以及在社交平台进行传播。在视频业务大数据平台中,播放数据的统计分析非常重要,所以Web播放器在使用过程中,需要对其内部的数据进行收集并上报至服务端,此时,就需要对发生在其内部的一些播放行为进行事件监听。 那么Web播放器事件监听是怎么实现的呢? 01 监听事件明细表 名...
3万字总结,Mysql优化之精髓
本文知识点较多,篇幅较长,请耐心学习 MySQL已经成为时下关系型数据库产品的中坚力量,备受互联网大厂的青睐,出门面试想进BAT,想拿高工资,不会点MySQL优化知识,拿offer的成功率会大大下降。 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计...
HTML5适合的情人节礼物有纪念日期功能
前言 利用HTML5,css,js实现爱心树 以及 纪念日期的功能 网页有播放音乐功能 以及打字倾诉感情的画面,非常适合情人节送给女朋友 具体的HTML代码 具体只要修改代码里面的男某某和女某某 文字段也可自行修改,还有代码下半部分的JS代码需要修改一下起始日期 注意月份为0~11月 也就是月份需要减一。 当然只有一部分HTML和JS代码不够运行的,文章最下面还附加了完整代码的下载地址 &lt;!...
相关热词 c# 压缩图片好麻烦 c#计算数组中的平均值 c#获取路由参数 c#日期精确到分钟 c#自定义异常必须继承 c#查表并返回值 c# 动态 表达式树 c# 监控方法耗时 c# listbox c#chart显示滚动条
立即提问