【发布时间】:2013-08-08 02:26:44
【问题描述】:
我读到 QT 在信号/槽机制上应用签名规范化过程。 MOC 生成器基本上从信号/插槽中删除了 const 引用限定符,然后按值传递它们。
我有一个类会频繁生成一个名为 BIG_DATA 的大数据结构,而其他一些类需要在每次发出该数据结构时捕获它。
struct BIG_DATA
{
// very big data
};
class DataGenerator
{
// some methods which generate BIG_DATA
signals:
void data_updated(const BIG_DATA &);
};
我在做什么:
connect(&data_generator_object, SIGNAL(data_updated(const BIG_DATA &)), this, SLOT(catch_new_data(const BIG_DATA &)));
QT 的作用:
connect(&data_generator_object, SIGNAL(data_updated(BIG_DATA)), this, SLOT(catch_new_data(BIG_DATA)));
那么,在这里删除 const 引用限定符有什么好处?我将如何处理将整个 BIG_DATA 复制到 data_updated 信号的许多客户端的开销?
似乎最好的方法是使用指向生成的 BIG_DATA 对象的指针,如果 QT 也没有尝试删除指针签名。
【问题讨论】:
-
connect是函数声明还是函数调用(或兼具两者的古怪宏)?它看起来像一个函数调用。您不要将参数类型放在函数调用中。SIGNAL呢? -
SIGNAL() 和 SLOT() 只是将参数转换为 char 数组的宏。 connect() 是一个函数调用。