关于成员函数参数的传递,该怎么处理
关于成员函数参数的传递
在《精通QT4编程》书中关于事件处理章节中有如下代码:
void DrawArea::resizeEvent(QResizeEvent *event)
{
if (width() > image.width() || height() > image.height()) {
int newWidth = qMax(width() 128, image.width());
int newHeight = qMax(height() 128, image.height());
resizeImage(&image, QSize(newWidth, newHeight));
update();
}
void DrawArea::resizeImage(QImage *image, const QSize &newSize)
{
if (image->size() == newSize)
return;
QImage newImage(newSize, QImage::Format_RGB32);
newImage.fill(qRgb(255, 255, 255));
QPainter painter(&newImage);
painter.drawImage(QPoint(0, 0), *image);
*image = newImage;
}
想问的是既然void resizeEvent()和void resizeImage()是类DrawArea类的成员函数,为什么在resizeImage()中数据成员Qimage image要以指针的形式传递,成员函数不是可以直接操作数据成员吗?
头文件如下:
#ifndef _DRAWAREA_H
#define _DRAWAREA_H
#include <QColor>
#include <QImage>
#include <QPoint>
#include <QWidget>
class DrawArea : public QWidget
{
Q_OBJECT
public:
DrawArea(QWidget *parent = 0);
bool isModified() const { return modified; }
void clearImage();
protected:
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void paintEvent(QPaintEvent *event);
void resizeEvent(QResizeEvent *event);
private:
void drawLineTo(const QPoint &endPoint);
void resizeImage(QImage *image, const QSize &newSize);
bool modified;
bool scribbling;
int myPenWidth;
QColor myPenColor;
QImage image;
QPoint lastPoint;
};
#endif
------解决方案--------------------
一个函数,尽量只依赖参数,而不访问全局变量、静态变量或成员变量。
这样的函数容易被测试、移植,是一种好的编程风格。
------解决方案--------------------
个人比较倾向于resizeImage可能会用来对其他image进行resize
就算实际上并没有这样的代码,这样写至少保留了一种可能性
这得看作者是怎么设计的
光看这两个函数的话,如果是我,是不会加这个参数
------解决方案--------------------
你给的头文件里
操作的那个image难道一定是那个class里的那个image?
我想操作其他的image的数据也可以吧,只不过名字起的一样,但是两个指的不一定是同一个。
在《精通QT4编程》书中关于事件处理章节中有如下代码:
void DrawArea::resizeEvent(QResizeEvent *event)
{
if (width() > image.width() || height() > image.height()) {
int newWidth = qMax(width() 128, image.width());
int newHeight = qMax(height() 128, image.height());
resizeImage(&image, QSize(newWidth, newHeight));
update();
}
void DrawArea::resizeImage(QImage *image, const QSize &newSize)
{
if (image->size() == newSize)
return;
QImage newImage(newSize, QImage::Format_RGB32);
newImage.fill(qRgb(255, 255, 255));
QPainter painter(&newImage);
painter.drawImage(QPoint(0, 0), *image);
*image = newImage;
}
想问的是既然void resizeEvent()和void resizeImage()是类DrawArea类的成员函数,为什么在resizeImage()中数据成员Qimage image要以指针的形式传递,成员函数不是可以直接操作数据成员吗?
头文件如下:
#ifndef _DRAWAREA_H
#define _DRAWAREA_H
#include <QColor>
#include <QImage>
#include <QPoint>
#include <QWidget>
class DrawArea : public QWidget
{
Q_OBJECT
public:
DrawArea(QWidget *parent = 0);
bool isModified() const { return modified; }
void clearImage();
protected:
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void paintEvent(QPaintEvent *event);
void resizeEvent(QResizeEvent *event);
private:
void drawLineTo(const QPoint &endPoint);
void resizeImage(QImage *image, const QSize &newSize);
bool modified;
bool scribbling;
int myPenWidth;
QColor myPenColor;
QImage image;
QPoint lastPoint;
};
#endif
------解决方案--------------------
一个函数,尽量只依赖参数,而不访问全局变量、静态变量或成员变量。
这样的函数容易被测试、移植,是一种好的编程风格。
------解决方案--------------------
个人比较倾向于resizeImage可能会用来对其他image进行resize
就算实际上并没有这样的代码,这样写至少保留了一种可能性
这得看作者是怎么设计的
光看这两个函数的话,如果是我,是不会加这个参数
------解决方案--------------------
你给的头文件里
void resizeImage(QImage *image, const QSize &newSize);
操作的那个image难道一定是那个class里的那个image?
class DrawArea : public QWidget
{
//...
QImage image;
//...
};
我想操作其他的image的数据也可以吧,只不过名字起的一样,但是两个指的不一定是同一个。