这里的虚操作符()()的目的是什么?
What is the purpose of a virtual operator ()() here?
我试图修改我发现的代码,但由于我缺乏对这个虚拟操作符的目的、重要性和/或相关性的理解,我被阻止了:
- 有人能解释一下为什么这个操作符是必要的或有用的吗?
- 我认为它以
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_
的值
有人能解释一下为什么这个操作符是必要的或有用的吗?
嗯,这主要取决于上下文和它要解决的实际问题。
很难从一行代码中得出结论。
如果你发现它没用,就不要用。就是这样。
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 这里的字符串函数是什么意思
- 这里的以下 OOP 结构是什么?
- 使用大括号实例化 - 它是什么,为什么在这里使用它?
- 新手在这里,到底什么是 acquireLock(),它的目的是什么?
- 这里发生了什么,还有输出是什么?(无线索)
- 此代码的输出是什么?我在这里错过了什么吗?
- ostream&...这里的'&'是什么?
- Visual C++ 这里的正确语法是什么
- "cin.exceptions"和"exception"在这里是什么意思
- 第二个参数和第三个参数在fwrite()中的作用是什么?为什么我们在这里需要 3rcount?
- 这里的unsigned关键字的作用是什么
- 设置在这里的目的是什么
- {错误 C2338: (boost::has_trivial_destructor:<T>:value)} 对于 boost::lockfree::queue 是什么意思?我在这里错过了什
- 这里的虚操作符()()的目的是什么?
- 这里分割故障的原因是什么?
- 面向对象概念的例子车,这里应该是什么对象
- 返回值复制问题(以改进调试时间)-- 这里的解决方案是什么?
- 这里的具体操作顺序是什么?
- SAFE[]在这里是什么意思