如何用vector管理自己写的类——加分贴

yayexing 2011-11-22 05:44:15
//自己写的类
class CDrectangle : public CButton
{
// Construction
public:
CDrectangle(); //构造矩形
CDrectangle(int row,int col,CRect rtgle); //构造矩形2
void DrawEmptyRectangle(CDC *pDC); //绘制矩形框
void DrawRectangle(CDC *pDC); //绘制实心矩形
void OnLeftBtnDown(CDC *pDC,CPoint pnt); //判断pnt是否在本矩形内,是则设置相应的参数并重新绘制相应矩形
public:
virtual ~CDrectangle();

// Generated message map functions
protected:

public:
int m_BtnRowNum; //矩形行号
int m_BtnColumnNum; //矩形列号
BOOL m_IsSelected; //是否选中
CPoint m_StartPt; //矩形起始点
CPoint m_EndPt; //矩形终止点
};

//////////////////////////函数具体实现//////////////////////
//构造矩形
CDrectangle::CDrectangle()
{
m_BtnRowNum=0;
m_BtnColumnNum=0;
m_IsSelected=FALSE;
m_StartPt.x=0;
m_StartPt.y=0;
m_EndPt.x=0;
m_EndPt.y=0;
}

//构造矩形2
CDrectangle::CDrectangle(int row,int col,CRect rtgle)
{
m_BtnRowNum=row;
m_BtnColumnNum=col;
m_IsSelected=FALSE;
m_StartPt.x=rtgle.left;
m_StartPt.y=rtgle.top;
m_EndPt.x=rtgle.right;
m_EndPt.y=rtgle.bottom;
}

//绘制矩形框
void CDrectangle::DrawEmptyRectangle(CDC *pDC)
{
CRect RectangleArea;
CPen penColor; //画笔
CBrush brushTanpt; //画刷

RectangleArea.left=m_StartPt.x;
RectangleArea.top=m_StartPt.y;
RectangleArea.right=m_EndPt.x;
RectangleArea.bottom=m_EndPt.y;

brushTanpt.CreateStockObject(NULL_BRUSH); //透明画刷
penColor.CreatePen(PS_SOLID,1,RGB(107,142,35)); //边框颜色

pDC->SelectObject(penColor);
pDC->SelectObject(brushTanpt);
pDC->Rectangle(RectangleArea);

brushTanpt.DeleteObject();
penColor.DeleteObject();
}

//绘制矩实心矩形
void CDrectangle::DrawRectangle(CDC *pDC)
{
CRect RectangleArea;
CPen penColor; //画笔
CBrush brushColor; //画刷

RectangleArea.left=m_StartPt.x;
RectangleArea.top=m_StartPt.y;
RectangleArea.right=m_EndPt.x;
RectangleArea.bottom=m_EndPt.y;

brushColor.CreateSolidBrush(RGB(154,205,50)); //黄绿色画刷
penColor.CreatePen(PS_SOLID,1,RGB(107,142,35)); //边框颜色

pDC->SelectObject(penColor);
pDC->SelectObject(brushColor);
pDC->Rectangle(RectangleArea);

brushColor.DeleteObject();
penColor.DeleteObject();
}

//判断pnt是否在本矩形内,是则设置相应的参数并重新绘制相应矩形
void CDrectangle::OnLeftBtnDown(CDC *pDC,CPoint pnt)
{
if (pnt.x>=m_StartPt.x && pnt.x<=m_EndPt.x)
{
if (pnt.y>=m_StartPt.y && pnt.y<=m_EndPt.y)
{
if (m_IsSelected==TRUE)
{
m_IsSelected=FALSE;
DrawEmptyRectangle(pDC);
}
else
{
m_IsSelected=TRUE;
DrawRectangle(pDC);
}
}
}
}

//析构
CDrectangle::~CDrectangle()
{}


////////////////////////////////调用//////////////////////////
对话框类中定义
public:
vector<CDrectangle> m_mgle;

对话框初始化的时候调用
void CLklkoDlg::initRectangle()
{
CRect aa(210,10,228,28);
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
CDrectangle regle(i,j,aa);
m_mgle.push_back(regle);

aa.left=aa.right+5;
aa.right=aa.left+18;
}
aa.left=210;
aa.right=aa.left+18;
aa.top=aa.bottom+5;
aa.bottom=aa.top+18;
}
}


对话按钮事件中调用
void CLklkoDlg::OnButton1()
{
// TODO: Add your control notification handler code here
CDC *pDC=this->GetDC();
for (int i=0;i<m_mgle.size();i++)
{
m_mgle[i]->DrawEmptyRectangle(pDC);
}
}
vector<CDrectangle> m_mgle;中不用指针为什么会报错呢。




另外:
我想在对话框里面定义了一个CDrectangle的成员变量,而且能在对话框按钮响应函数里面调用带参的构造函数,请问怎么实现呢。我现在在对话框类里面定义了一个CDrectangle的成员变量,但在对话框的按钮响应函数里面在调用带参的构造函数报错。
请问这个问题和上面的那个问题怎么解决呢。小弟谢谢先。
...全文
160 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
yayexing 2011-12-01
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 sophyyoung 的回复:]

报什么错?
[/Quote]
是我自己写错了,我写成下面这样了
CLklkoDlg::CLklkoDlg(CWnd* pParent /*=NULL*/)
: CDialog(CLklkoDlg::IDD, pParent)
, llll.CDrectangle(1,1,CRect(1,1,1,1))
{
}
呵呵,sophyyoung的方法没错
yayexing 2011-12-01
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 sophyyoung 的回复:]

报什么错?
[/Quote]
报的错是这个
error C2059: syntax error : '.'
yayexing 2011-12-01
  • 打赏
  • 举报
回复
这段时间请假了,没网可上。劳烦大家了。楼上版主能详细些吗。
向立天 2011-11-25
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 yayexing 的回复:]
引用 10 楼 xianglitian 的回复:

引用 8 楼 yayexing 的回复:
引用 6 楼 xianglitian 的回复:

vector<CDrectangle> mgle;
这里最好用指针管理,否则对象复制的代价会比较大
vector<CDrectangle*> mgle;
而且没看你做拷贝构造函数啊

关于第二个问题你具体怎么调用的
按理说你有两个构造……
[/Quote]
构造函数是自动调用的
类似
CDrectangle llll(1,1,CRect(1,1,1,1));
你要是非要通过对象对用可以另写一个set函数
sophyyoung 2011-11-24
  • 打赏
  • 举报
回复
报什么错?
向立天 2011-11-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 yayexing 的回复:]
引用 6 楼 xianglitian 的回复:

vector<CDrectangle> mgle;
这里最好用指针管理,否则对象复制的代价会比较大
vector<CDrectangle*> mgle;
而且没看你做拷贝构造函数啊

关于第二个问题你具体怎么调用的
按理说你有两个构造函数的版本不应该有问题的

我在对话框里定义了成员变量,在对话框按钮响应事件函数中想调用带参数的……
[/Quote]
这样调用不应该有问题啊
yayexing 2011-11-23
  • 打赏
  • 举报
回复
我还想问一下各位4楼的问题,麻烦大家了,谢谢。
yayexing 2011-11-23
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xianglitian 的回复:]

vector<CDrectangle> mgle;
这里最好用指针管理,否则对象复制的代价会比较大
vector<CDrectangle*> mgle;
而且没看你做拷贝构造函数啊

关于第二个问题你具体怎么调用的
按理说你有两个构造函数的版本不应该有问题的
[/Quote]
我在对话框里定义了成员变量,在对话框按钮响应事件函数中想调用带参数的构造函数。
sophyyoung 2011-11-23
  • 打赏
  • 举报
回复
我用vector 都是用指针的。
vector<CUseRectangle*> m_reg;
CUseRectangle *pUseRec = new CUseRectangle(i,j,aa);
m_reg.push_back(pUseRec);

以后要释放,在对话框的析构函数里释放
if(!m_reg.empty())
{
vector<CUseRectangle*>::iterator clrItor;
for(clrItor = m_reg.begin(); clrItor != m_reg.end(); ++clrItor)
{
delete *clrItor;
}
m_reg.clear();
}
向立天 2011-11-23
  • 打赏
  • 举报
回复
vector<CDrectangle> mgle;
这里最好用指针管理,否则对象复制的代价会比较大
vector<CDrectangle*> mgle;
而且没看你做拷贝构造函数啊

关于第二个问题你具体怎么调用的
按理说你有两个构造函数的版本不应该有问题的
dahaiI0 2011-11-23
  • 打赏
  • 举报
回复
序列化时先file.SeekToEnd();试试,我记得应该是可以的,实在不行先反序列化保存所有的,再一次写入(无奈之举)
yayexing 2011-11-23
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 sophyyoung 的回复:]

构造函数哪里是这样用的??
在CLklkoDlg 的构造函数里比如
C/C++ code

CLklkoDlg::CLklkoDlg(CWnd* pParent /*=NULL*/)
: CDialog(CLklkoDlg::IDD, pParent)
, llll(1,1,CRect(1,1,1,1))
{
}
[/Quote]

CLklkoDlg是一个对话框类
我按照你的说法还是报错
为什么啊。
sophyyoung 2011-11-23
  • 打赏
  • 举报
回复
CFile 打开的时候 open 里面的参数用 CFile::modeNoTruncate||CFile::modeCreate,可以不截断文件,但我都是用的 CFile::Read 和 Write的, CArchive 不清楚
sophyyoung 2011-11-23
  • 打赏
  • 举报
回复
构造函数哪里是这样用的??
在CLklkoDlg 的构造函数里比如

CLklkoDlg::CLklkoDlg(CWnd* pParent /*=NULL*/)
: CDialog(CLklkoDlg::IDD, pParent)
, llll(1,1,CRect(1,1,1,1))
{
}
yayexing 2011-11-23
  • 打赏
  • 举报
回复
我还想问一个问题:使用MFC的CFile文件类和CArchive串行化类进行二进制文件读写操作调用Serialize串行化,每调用一次是不是就把原来的覆盖掉了,能每一次调用都在原来写入的末尾添加呢。
yayexing 2011-11-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 xianglitian 的回复:]

引用 8 楼 yayexing 的回复:
引用 6 楼 xianglitian 的回复:

vector<CDrectangle> mgle;
这里最好用指针管理,否则对象复制的代价会比较大
vector<CDrectangle*> mgle;
而且没看你做拷贝构造函数啊

关于第二个问题你具体怎么调用的
按理说你有两个构造函数的版本不应该有问题的

我在对话框里定义了成员……
[/Quote]


class CLklkoDlg : public CDialog
{
.........
public:
vector<CDrectangle*> m_mgle;
CDrectangle llll;
};

void CLklkoDlg::OnButton1()
{
// TODO: Add your control notification handler code here
llll.CDrectangle(1,1,CRect(1,1,1,1));
}

//这是报的错
error C2274: 'function-style cast' : illegal as right side of '.' operator
  • 打赏
  • 举报
回复
你是要重绘按钮呢还是只是绘制一个矩形
hztj2005 2011-11-22
  • 打赏
  • 举报
回复
vector<CDrectangle> m_mgle;

这定义了一个object,所谓object就需要内存分配,而类定义中不进行内存分配,就像类中只能
申明数据成员,而不能给数据成员赋初值一样。

你的问题可以这样解决。

在cpp文件中定义全局的:

vector<CDrectangle> mgle;

在类申明中:

vector<CDrectangle> *pmgle;
或者:
vector<CDrectangle>::iterator pmgle;

然后在适当的地方让:

pmgle=&mgle;

pmgle=mgle.begin();


dahaiI0 2011-11-22
  • 打赏
  • 举报
回复
CDrectangle 不需要基类
部分程序未完成所有功能,,,东华理工2011届课程设计,,汇总 1. 有理数运算 有理数是一个可以化为一个分数的数,例如2/3,533/920,-12/49都是有理数,而就为无理数。在C++中,并没有预先定义有理数,需要时可以定义一个有理数,将有理数的分子和分母分别存放在两个整型变量中。对有理数的各种操作都可以用重载运算符来实现。 定义并实现一个有理数,通过重载运算符+、-、*、/对有理数进行算术运算,通过重载运算符==实现判定两个有理数是否相等。一个优化函数,它的作用是使有理数约去公分母,也即是使保存的有理数分子和分母之间没有公约数(除去1以外)。此外,还要定义一个将有理数转换为实数的函数,再加上构造函数和有理数输出函数。 2. 模拟计算器 设计一个程序来模拟一个简单的手持计算器。程序支持算术运算+、-、*、/、=、以及C(清除)、A(全清除)操作。 定义一个计算器,该包括两个组件对象,一个计算引擎和一个用户接口,用户接口对象处理接受的键盘输入信息,并显示答案,计算引擎对象对给出的数据执行相应操作,并存储操作的结果。 3. 设计一个Database 设计一个Database。Database是一个表的集合,而表又由行和列组成。例如,下面的雇员信息表包含三个记录,每个记录有四个字段( Employee、Name、Department和Boss)。 雇员 姓名 部门 部门经理 111-11-1234 Cruz ACC Warder 213-44-5649 Johnston MIS Michaels 321-88-7895 Tom FIN Bearskin 能够完成对数据库的基本操作;包括创建数据库,实现对数据库里面的表的添加,删除;以及能够完成对表结构的修改(如添加或删除字段),以及对表中的记录进行添加和删除;能够完成对使用适当的查询语言从一个或多个表中查找相关信息。 4、 矩阵设计 定义Matrix,参照实现: (1) 任意行数,列数矩阵的构建 (2) 常数矩阵 (3) 转置矩阵 (4) 矩阵加法,减法,乘法 (5) 矩阵与数组间的转换 (6) 逆矩阵 (7) 矩阵的输入与输出 (8) 完成相应应用程序设计 5、 表格设计 定义Table,参照实现: a) 任意行数,列数表格的构建 b) 表格标题设置 c) 表头的定义 d) 表格数据的输入及修改 e) 表格框线的绘制 f) 表格数据显示 g) 表格数据的统计计算 h) 完成相应应用程序设计 6、 堆栈设计* 定义Stack,参照实现: a) 用数组实现先进后出的数据结构 b) 栈顶指针的设置 c) 进栈操作 d) 出栈操作 e) 空栈与栈满溢出判定 f) 完成相应应用程序设计 7、 矢量设计* 定义Vector,参照实现: a) 矢量的构建 b) 矢量的加法,减法 c) 矢量的点积 d) 矢量的叉积 e) 矢量的输出 f) 完成相应应用程序的设计 8、 链表设计 定义Link,参照实现: a) 建立链表的数据结构 b) 输入链表结点的数据 c) 显示链表结点数据 d) 插入链表结点 e) 删除链表结点 f) 完成相应应用程序设计 9、通信录的设计 一、定义人员(person),其中至少包括姓名、性别、电话、地址、邮政编码、邮箱、QQ号和别(例如:同学、朋友等)。 二、实现下面的功能 1、设计菜单实现功能选择; 2、输入功能:输入人员信息,并保存到文件中; 3、查询功能: 1)能够根据姓名、电话精确查询人员信息; 2)能够根据地址进行模糊查询人员信息; 3)根据人员别查询人员信息 4、根据姓名对人员信息排序输出 5、能根据姓名、电话修改人员信息 6、能根据姓名、电话删除人员信息 10、职工工资管理 一、定义职工(employee ),其中至少包括姓名、性别、工号、电话、所在科室和工资。 二、实现下面的功能 1、设计菜单实现功能选择; 2、输入功能:输入职工信息,并保存到文件中; 3、查询功能: 1)能够根据工号精确查询职工信息; 2)能够根据姓名、科室查询职工信息 3)分科室进行工资统计,计算各科室的平均工资 4、根据职工的工资排序输出 5、根据工号修改职工信息 6、根据工号删除职工信息 11、三角形的种与面积 一、定义点(point),包含点的坐标x和y;通过继承点派生出线段(line);通

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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