这里虚拟运算符 ()() 的目的是什么?
What is the purpose of a virtual operator ()() here?
我正在尝试修改 code I found,但由于不了解此虚拟运算符的目的、重要性、and/or 相关性而受阻:
- 有人可以提供有关此运算符为何必要或有用的见解吗?
- 我认为它以
parentItem()
、rect_
、resizer_
为参数,然后修改resizer_
的值对吗?
.h 中的构造函数:
virtual void operator()(QGraphicsItem* item, const QRectF& rect) = 0;
在 .cpp 中调用:
(*resizer_)(parentItem(), rect_);
构造函数的修剪上下文供参考:
class SizeGripItem : public QGraphicsItem
{
private:
class HandleItem : public QGraphicsRectItem
{
public:
HandleItem(int positionFlags, SizeGripItem* parent);
private:
SizeGripItem* parent_;
};
public:
class Resizer
{
public:
virtual void operator()(QGraphicsItem* item,
const QRectF& rect) = 0;
};
SizeGripItem(Resizer* resizer = 0, QGraphicsItem* parent = 0);
virtual ~SizeGripItem();
private:
void doResize();
QRectF rect_;
Resizer* resizer_;
};
关于第 2 点,考虑这一行:
(*resizer_)(parentItem(), rect_);
resizer_
可能是指向未知类型 T
的对象的指针,因此 *resizer
是对相同类型 T
的对象的引用。
如果它有一个 operator()
的定义,它接受两个具有类型(让我说)decltype(parentItem())
和 decltype(rect_)
的参数,您可以像在示例中那样调用它。
换句话说,它相当于:
resizer_->operator()(parentItem(), rect_);
根本不修改resizer_
的值。
Can someone provide insight as to why this operator is necessary or useful?
嗯,这主要取决于上下文和它旨在解决的实际问题。
从一行代码很难说。
如果您觉得它没用,请不要使用它。就这些了。
Resizer
是一个broken attempt at a (函数对象)。这样的习惯用法在 C++11 之前很有用。它被破坏了,因为如果没有虚拟析构函数,这样的仿函数是无用的。它应该如下所示:
class Resizer {
public:
virtual void operator()(QGraphicsItem* item, const QRectF& rect) = 0;
virtual ~Resizer() {}
};
这样的对象是可调用的:
void invokeResizer(Resizer * resizer, QGraphicsItem * item, const QRectF & rect) {
(*resizer)(item, rect);
}
以上将在 resizer
对象上执行方法 operator()(QGraphicsItem*,const QRectF&)
。
在现代代码中,应该使用 std::function<void(QGraphicsItem*, const QRectF &)>
.
而不是这样的 hack
我正在尝试修改 code I found,但由于不了解此虚拟运算符的目的、重要性、and/or 相关性而受阻:
- 有人可以提供有关此运算符为何必要或有用的见解吗?
- 我认为它以
parentItem()
、rect_
、resizer_
为参数,然后修改resizer_
的值对吗?
.h 中的构造函数:
virtual void operator()(QGraphicsItem* item, const QRectF& rect) = 0;
在 .cpp 中调用:
(*resizer_)(parentItem(), rect_);
构造函数的修剪上下文供参考:
class SizeGripItem : public QGraphicsItem
{
private:
class HandleItem : public QGraphicsRectItem
{
public:
HandleItem(int positionFlags, SizeGripItem* parent);
private:
SizeGripItem* parent_;
};
public:
class Resizer
{
public:
virtual void operator()(QGraphicsItem* item,
const QRectF& rect) = 0;
};
SizeGripItem(Resizer* resizer = 0, QGraphicsItem* parent = 0);
virtual ~SizeGripItem();
private:
void doResize();
QRectF rect_;
Resizer* resizer_;
};
关于第 2 点,考虑这一行:
(*resizer_)(parentItem(), rect_);
resizer_
可能是指向未知类型 T
的对象的指针,因此 *resizer
是对相同类型 T
的对象的引用。
如果它有一个 operator()
的定义,它接受两个具有类型(让我说)decltype(parentItem())
和 decltype(rect_)
的参数,您可以像在示例中那样调用它。
换句话说,它相当于:
resizer_->operator()(parentItem(), rect_);
根本不修改resizer_
的值。
Can someone provide insight as to why this operator is necessary or useful?
嗯,这主要取决于上下文和它旨在解决的实际问题。
从一行代码很难说。
如果您觉得它没用,请不要使用它。就这些了。
Resizer
是一个broken attempt at a
class Resizer {
public:
virtual void operator()(QGraphicsItem* item, const QRectF& rect) = 0;
virtual ~Resizer() {}
};
这样的对象是可调用的:
void invokeResizer(Resizer * resizer, QGraphicsItem * item, const QRectF & rect) {
(*resizer)(item, rect);
}
以上将在 resizer
对象上执行方法 operator()(QGraphicsItem*,const QRectF&)
。
在现代代码中,应该使用 std::function<void(QGraphicsItem*, const QRectF &)>
.