在 C++ 中,我经常(几乎总是)遇到构造函数的问题;我永远不确定如何使用参数,最终我将最终只为每个类使用无参数构造函数。然后我将在每个实例定义之后使用 setter。例如:
// Obviously better
Point p(5, 3);
// ...and yet I end up using this
Point p;
p.setX(5);
p.setY(3);
我最终使用“更糟糕”的方法的原因是因为有些类需要太多参数,并且有太多不同的可能性来构造它们,所以我的想法变得一团糟,我不再知道我应该做什么。这是我最近制作的一个类的示例(它使用 Qt):
// implements position and pixmap (image shown when painted)
class Block : QObject {
public:
Block(const QPixmap &img = Pixmap(), QObject *parent = 0);
Block(const QPoint &pos, const QPixmap &img = Pixmap(), QObject *parent = 0);
Block(int x, int y, const QPixmap &img = Pixmap(), QObject *parent = 0);
Block(const Block &other);
};
只有一个只有两个属性(position
和image
)的类,我已经得到了四个构造函数,最多接受四个参数。Block(QObject *parent = 0);
此外,我经常看到人们用and替换第一个构造函数,Block(const QPixmap &img, QObject *parent = 0);
我不确定这是否是一件好事。
那么,如果我创建一个Rectangle
自己的类,它继承自Block
所以它也需要接受image
和position
作为它的参数:
Rect(const QPixmap &img = QPixmap(), QObject *parent = 0);
Rect(const QRect &rect, const QPixmap &pixmap = QPixmap(), QObject *parent = 0);
Rect(const QSize &size, const QPoint &pos = QPoint(), const QPixmap &img = QPixmap(), QObject *parent = 0);
Rect(const QPoint &pos, const QPixmap &img = QPixmap(), QObject *parent = 0);
Rect(int x, int y, int w = 1, int h = 1, QPixmap &img = QPixmap(), QObject *parent = 0);
Rect(int w, int h, QPixmap &img = QPixmap(), QObject *parent = 0);
Rect(const QPoint &pos, int w, int h, QPixmap &img = QPixmap(), QObject *parent = 0);
Rect(int x, int y, const QSize &size, QPixmap &img = QPixmap(), QObject *parent = 0);
Rect(const Rect &rect);
如您所见,它开始看起来很糟糕,而且很难维护。想象一下Player
类继承Rect
并实现items
, health
, mana
, damage
, armor
... 我发现编写这样的构造函数是不可能的。
所以现在我已经给了你这个问题,我不确定这个问题;我需要任何提示或技巧来帮助我使用构造函数、何时使用默认参数以及我需要多久使用一次所有构造函数,是的,只是一些提示可以防止我为一个类创建 500 个构造函数;我应该只用我原来的p.setX(5);
例子吗?