在结构体作为函数参数时,如何赋默认值?

时间:2022-03-07 09:55:16
有如下一个函数:
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之所有能这么用,也是因为它重载了"="运算符

#2


楼上的,你先看清楚啊,我不想修改MFC原有的东西,再者POINT是很简单的一个结构体,并没有重载"="操作
其定义如下:
typedef struct tagPOINT
{
    LONG  x;
    LONG  y;
} POINT, *PPOINT, NEAR *NPPOINT, FAR *LPPOINT;

#3


自己顶一下

#4


引用 2 楼 tomhe666 的回复:
楼上的,你先看清楚啊,我不想修改MFC原有的东西,再者POINT是很简单的一个结构体,并没有重载"="操作
其定义如下:
typedef struct tagPOINT
{
  LONG x;
  LONG y;
} POINT, *PPOINT, NEAR *NPPOINT, FAR *LPPOINT;

编译器会默认生成一个 ==的重载操作函数的。

#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,这个无需解释了

#6


给结构体默认值,如果是自己的结构体,在结构体里加一个默认的构造函数不就完了吗,像类的构造函数一样

#7


要给函数的结构体默认值只能是结构体本身有复制构造函数才可以。
其它的话你就曲线救国吧。可以在函数里面判断再赋值等

#8


自己给结构体派生一个类,用类实现重载=操作符试试

#9


    如果非要给结构体写一个构造函数的话,我觉得还是CLASS来得直接, 本想直接用POINT结构,而不是CPoint类,是考虑到这个绘图涵数在鼠标移动时要不停的调用,如果目标比较多的话,经过N次的调用总是会慢上那么一点的.
    感谢各位的帮助,如果只能这样,就结贴吧

#10


引用 9 楼 tomhe666 的回复:
    如果非要给结构体写一个构造函数的话,我觉得还是CLASS来得直接, 本想直接用POINT结构,而不是CPoint类,是考虑到这个绘图涵数在鼠标移动时要不停的调用,如果目标比较多的话,经过N次的调用总是会慢上那么一点的.
    感谢各位的帮助,如果只能这样,就结贴吧

随便一个消息,Windows内部都要调用至少几十个函数,CPoint的构造时间,可以忽略

#1


给你的结构体重载一个“=”运算符就可以了
POINT之所有能这么用,也是因为它重载了"="运算符

#2


楼上的,你先看清楚啊,我不想修改MFC原有的东西,再者POINT是很简单的一个结构体,并没有重载"="操作
其定义如下:
typedef struct tagPOINT
{
    LONG  x;
    LONG  y;
} POINT, *PPOINT, NEAR *NPPOINT, FAR *LPPOINT;

#3


自己顶一下

#4


引用 2 楼 tomhe666 的回复:
楼上的,你先看清楚啊,我不想修改MFC原有的东西,再者POINT是很简单的一个结构体,并没有重载"="操作
其定义如下:
typedef struct tagPOINT
{
  LONG x;
  LONG y;
} POINT, *PPOINT, NEAR *NPPOINT, FAR *LPPOINT;

编译器会默认生成一个 ==的重载操作函数的。

#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,这个无需解释了

#6


给结构体默认值,如果是自己的结构体,在结构体里加一个默认的构造函数不就完了吗,像类的构造函数一样

#7


要给函数的结构体默认值只能是结构体本身有复制构造函数才可以。
其它的话你就曲线救国吧。可以在函数里面判断再赋值等

#8


自己给结构体派生一个类,用类实现重载=操作符试试

#9


    如果非要给结构体写一个构造函数的话,我觉得还是CLASS来得直接, 本想直接用POINT结构,而不是CPoint类,是考虑到这个绘图涵数在鼠标移动时要不停的调用,如果目标比较多的话,经过N次的调用总是会慢上那么一点的.
    感谢各位的帮助,如果只能这样,就结贴吧

#10


引用 9 楼 tomhe666 的回复:
    如果非要给结构体写一个构造函数的话,我觉得还是CLASS来得直接, 本想直接用POINT结构,而不是CPoint类,是考虑到这个绘图涵数在鼠标移动时要不停的调用,如果目标比较多的话,经过N次的调用总是会慢上那么一点的.
    感谢各位的帮助,如果只能这样,就结贴吧

随便一个消息,Windows内部都要调用至少几十个函数,CPoint的构造时间,可以忽略