这里的虚操作符()()的目的是什么?

What is the purpose of a virtual operator ()() here?

本文关键字:是什么 这里 操作符      更新时间:2023-10-16

我试图修改我发现的代码,但由于我缺乏对这个虚拟操作符的目的、重要性和/或相关性的理解,我被阻止了:

  1. 有人能解释一下为什么这个操作符是必要的或有用的吗?
  2. 我认为它以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_;
};

Resizer是对多态函子(函数对象)的失败尝试。这种习惯用法在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。

关于第2点,考虑这一行:

(*resizer_)(parentItem(), rect_);

resizer_很可能是指向未知类型T的对象的指针,因此*resizer是对同一类型T的对象的引用。
如果它有一个operator()的定义,该定义接受两个类型为(让我说)decltype(parentItem())decltype(rect_)的参数,则可以像示例中那样调用它。换句话说,它相当于:

resizer_->operator()(parentItem(), rect_);

不修改resizer_的值

有人能解释一下为什么这个操作符是必要的或有用的吗?

嗯,这主要取决于上下文和它要解决的实际问题。
很难从一行代码中得出结论。
如果你发现它没用,就不要用。就是这样。