父子关系设置为Qt中的成员变量
Parent-child relationship set to member variables in Qt
我在这里阅读Qt文档。我在标题"线程亲和性"下发现了下面的句子。
注意:QObject的成员变量不会自动成为它的子变量。父-子关系必须通过传递给子类构造函数的指针或调用setParent()来设置。
我不明白它提到的设置对象和它的成员变量之间的父子关系。我只知道父类和子类之间的亲子关系。
谁能给我解释一下这个句子?如果你能举个例子就更有帮助了。如果不显式设置parent
属性,成员变量NOT将成为子对象。Object
子类通常在构造函数中以另一个QObject
作为它的父类。
class Test : public QObject
{
Q_OBJECT
public:
Test(QObject* prnt)
: QObject(prnt),
timerNoPrnt(), // Test object is NOT the parent. This won't be deleted when Test object gets deleted.
timer(this) // Test object is the parent here. This will be deleted when Test object gets deleted.
{
timerNoPrnt->setParent(this); // now parent assigned.
}
private:
QTimer* timerNoPrnt; // member variable
QTimer* timer;
}
一个QObject (A
)可以有其他QObject (B
)作为成员变量。B
不会自动与A
一起创建,也不必这样做。这是可能的,但不是必须的,也不是自动完成的。
不仅类和它的超类(基类)之间存在父子关系,而且QWidget和嵌入的小部件之间也存在父子关系。例如,它用于最终以正确的顺序销毁小部件。
请参阅此处的文档和关于内存管理的SO的答案。
QObject
是对象容器。它所包含的对象称为它的子对象,包含对象被认为是这些子对象的父对象。这本身并没有说明如何以及如何分配子节点。让我们看看c++ 11中的一些场景:
void test() {
QObject aParent;
// children of automatic storage duration
QObject aChild1{&aParent}, aChild2;
aChild2->setParent(&aParent);
// children of dynamic storage duration
auto aChild3 = new QObject{&aParent};
auto aChild4 = new QObject;
aChild4->setParent(&aParent);
}
struct Parent : QObject {
QObject aChild5 { this };
QObject * aChild6 { new QObject };
QObject notAChild;
Parent() { aChild6->setParent(this); }
};
test()
函数演示了一个对象如何成为一些具有自动和动态存储持续时间的子对象的父对象。父对象可以在构造函数中给出,也可以作为setParent
方法的参数给出。
Parent
类说明成员对象可以是父类的子类,但不一定是。成员值具有自动存储持续时间,但并非所有子对象都具有。aChild6
所指向的对象是动态存储持续时间。由于QObject
删除其析构函数中的所有子对象,因此对象在aChild6
的有效存储持续时间是自动的:您不必担心必须删除对象。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 将包含C样式数组的对象初始化为成员变量(C++)
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 在循环中按顺序遍历成员变量
- c++类声明时,相同的例程,不同的成员变量类型
- 如何从另一个文件继承私有成员变量和公共函数
- 在C++类中,是否必须初始化作为数组的成员变量
- 如何从子成员函数修改父公共成员变量
- 我可以在 C++ 中将数据成员/变量从其定义之外添加到结构中吗?
- 从私有成员变量的成员方法返回unique_ptr
- 在派生类中使用基类的私有成员变量的最佳方法
- 静态 constexpr 类成员变量对多线程读取是否安全?
- C++:是否可以使用非静态成员变量模板?
- 打印所有继承的类成员变量和方法
- 如何在复杂继承中访问静态成员变量
- 为什么我不能在返回 const 的布尔函数中为类成员变量赋值?C++
- 成员变量与函数概念检查