void DrawShape(CDC* pDC, POINT origin);
我想给第二个参数POINT赋上默认值,写成这样:
void DrawShape(CDC* pDC, POINT origin = {0,0});
编译不能通过,不得于用了个曲线救国的方法,如下:
void DrawShape(CDC* pDC, POINT origin = CPoint(0,0));
这样是可以的,但是推广开来,并不是所有的结构体xx有有一个对应的Cxx类,就算有,不一定其构造函数适合赋值用.当然有人得说了,你可以自己再写一个吗.问题是像POINT这样MFC本身已写义好的结构,我自己再写一个,改动了合适吗?请高人指点在结构体作为函数参数时如何赋默认值的方法
10 个解决方案
#1
给你的结构体重载一个“=”运算符就可以了
POINT之所有能这么用,也是因为它重载了"="运算符
POINT之所有能这么用,也是因为它重载了"="运算符
#2
楼上的,你先看清楚啊,我不想修改MFC原有的东西,再者POINT是很简单的一个结构体,并没有重载"="操作
其定义如下:
typedef struct tagPOINT
{
LONG x;
LONG y;
} POINT, *PPOINT, NEAR *NPPOINT, FAR *LPPOINT;
其定义如下:
typedef struct tagPOINT
{
LONG x;
LONG y;
} POINT, *PPOINT, NEAR *NPPOINT, FAR *LPPOINT;
#3
自己顶一下
#4
编译器会默认生成一个 ==的重载操作函数的。
#5
你可以MFC里,可以如下用:
例如:
InvalidateRect(CRect(10,10,50,50));
dc.MoveTo(CPoint(10,11));
dc.SelectObject(&CBrush(RGB(255,0,0)));
InvalidateRect(CRect(10,10,50,50));
第一个参数类型为:LPCRECT lpRect,这是一个指向Rect的指针
而CRect重载了operator LPCRECT,故能隐式转换
dc.MoveTo(CPoint(10,11));
第一个参数类型为:POINT point
而CPoint重载了: BOOL operator==(POINT point) const;故能隐式转换
dc.SelectObject(&CBrush(RGB(255,0,0)));
要求类型为*CBrush,这个无需解释了
例如:
InvalidateRect(CRect(10,10,50,50));
dc.MoveTo(CPoint(10,11));
dc.SelectObject(&CBrush(RGB(255,0,0)));
InvalidateRect(CRect(10,10,50,50));
第一个参数类型为:LPCRECT lpRect,这是一个指向Rect的指针
而CRect重载了operator LPCRECT,故能隐式转换
dc.MoveTo(CPoint(10,11));
第一个参数类型为:POINT point
而CPoint重载了: BOOL operator==(POINT point) const;故能隐式转换
dc.SelectObject(&CBrush(RGB(255,0,0)));
要求类型为*CBrush,这个无需解释了
#6
给结构体默认值,如果是自己的结构体,在结构体里加一个默认的构造函数不就完了吗,像类的构造函数一样
#7
要给函数的结构体默认值只能是结构体本身有复制构造函数才可以。
其它的话你就曲线救国吧。可以在函数里面判断再赋值等
其它的话你就曲线救国吧。可以在函数里面判断再赋值等
#8
自己给结构体派生一个类,用类实现重载=操作符试试
#9
如果非要给结构体写一个构造函数的话,我觉得还是CLASS来得直接, 本想直接用POINT结构,而不是CPoint类,是考虑到这个绘图涵数在鼠标移动时要不停的调用,如果目标比较多的话,经过N次的调用总是会慢上那么一点的.
感谢各位的帮助,如果只能这样,就结贴吧
感谢各位的帮助,如果只能这样,就结贴吧
#10
随便一个消息,Windows内部都要调用至少几十个函数,CPoint的构造时间,可以忽略
#1
给你的结构体重载一个“=”运算符就可以了
POINT之所有能这么用,也是因为它重载了"="运算符
POINT之所有能这么用,也是因为它重载了"="运算符
#2
楼上的,你先看清楚啊,我不想修改MFC原有的东西,再者POINT是很简单的一个结构体,并没有重载"="操作
其定义如下:
typedef struct tagPOINT
{
LONG x;
LONG y;
} POINT, *PPOINT, NEAR *NPPOINT, FAR *LPPOINT;
其定义如下:
typedef struct tagPOINT
{
LONG x;
LONG y;
} POINT, *PPOINT, NEAR *NPPOINT, FAR *LPPOINT;
#3
自己顶一下
#4
编译器会默认生成一个 ==的重载操作函数的。
#5
你可以MFC里,可以如下用:
例如:
InvalidateRect(CRect(10,10,50,50));
dc.MoveTo(CPoint(10,11));
dc.SelectObject(&CBrush(RGB(255,0,0)));
InvalidateRect(CRect(10,10,50,50));
第一个参数类型为:LPCRECT lpRect,这是一个指向Rect的指针
而CRect重载了operator LPCRECT,故能隐式转换
dc.MoveTo(CPoint(10,11));
第一个参数类型为:POINT point
而CPoint重载了: BOOL operator==(POINT point) const;故能隐式转换
dc.SelectObject(&CBrush(RGB(255,0,0)));
要求类型为*CBrush,这个无需解释了
例如:
InvalidateRect(CRect(10,10,50,50));
dc.MoveTo(CPoint(10,11));
dc.SelectObject(&CBrush(RGB(255,0,0)));
InvalidateRect(CRect(10,10,50,50));
第一个参数类型为:LPCRECT lpRect,这是一个指向Rect的指针
而CRect重载了operator LPCRECT,故能隐式转换
dc.MoveTo(CPoint(10,11));
第一个参数类型为:POINT point
而CPoint重载了: BOOL operator==(POINT point) const;故能隐式转换
dc.SelectObject(&CBrush(RGB(255,0,0)));
要求类型为*CBrush,这个无需解释了
#6
给结构体默认值,如果是自己的结构体,在结构体里加一个默认的构造函数不就完了吗,像类的构造函数一样
#7
要给函数的结构体默认值只能是结构体本身有复制构造函数才可以。
其它的话你就曲线救国吧。可以在函数里面判断再赋值等
其它的话你就曲线救国吧。可以在函数里面判断再赋值等
#8
自己给结构体派生一个类,用类实现重载=操作符试试
#9
如果非要给结构体写一个构造函数的话,我觉得还是CLASS来得直接, 本想直接用POINT结构,而不是CPoint类,是考虑到这个绘图涵数在鼠标移动时要不停的调用,如果目标比较多的话,经过N次的调用总是会慢上那么一点的.
感谢各位的帮助,如果只能这样,就结贴吧
感谢各位的帮助,如果只能这样,就结贴吧
#10
随便一个消息,Windows内部都要调用至少几十个函数,CPoint的构造时间,可以忽略