c++ - 是否允许通过指向另一个类的实例的指针发出信号?
问题描述
最小的例子:
class Foo : public QObject
{
Q_OBJECT
signals:
void
TestSignal(int i) const;
};
class Bar : public QObject
{
Q_OBJECT
public:
Bar(Foo* foo) :
mFoo{ foo }
{}
void
TestEmit(int i) const
{
emit mFoo->TestSignal(i);
}
private:
Foo* mFoo;
};
void
Print(int i)
{
std::cout << i << std::endl;
}
用法:
Foo aFoo;
Bar aBar{ &aFoo };
connect(&aFoo, &Foo::TestSignal, &Print);
aBar.TestEmit(1337);
所以我使用指向实例的指针Foo::TestSignal
从函数发出信号。这似乎工作正常,但它允许吗?(如:可靠的定义行为)。Bar::TestEmit
Foo
解决方案
来自https://doc.qt.io/qt-5/signalsandslots.html:
信号是公共访问函数,可以从任何地方发出,但我们建议只从定义信号的类及其子类中发出它们
我知道它在技术上是允许的和可靠的,但在代码设计方面不推荐。
您可能也有兴趣将信号连接到另一个,如此处所述https://doc.qt.io/qt-5/qobject.html#connect
推荐阅读
- java - 如何支持应用在所有包含指纹功能的设备上运行
- linux - 使用差异时需要二元运算符
- unit-testing - 如何在 VSCode 的 vue 应用程序中调试 mocha 单元测试?
- c++ - 如何访问不同类中的属性
- python - Ubuntu更新后环境变得一团糟
- java - 试图找出两个 2*2 矩阵之间的差异。我有这段代码,但它提供了无效的值
- keras - InceptionResnetV2 STEM block keras implementation 与原始论文中的不匹配?
- git - 如何加密文件并将其存储在 LFS 上?
- spring-boot - 按配置文件和名称选择 Bean
- flutter - Flutter firebase_admob 给出未注册的服务未处理异常