正如(我认为)Scott Meyers 指出的那样,RAII 的名称是错误的。
不应该叫“资源获取就是初始化”,应该叫“销毁就是资源释放”。但我们就在我们所在的地方。
如果 Cell “拥有” 指向的对象representation_
,并在其析构函数中将其删除,那么这仍然是 RAII 的一种形式,就像您可以shared_ptr
使用空指针初始化 a 一样,然后将其设置为其他值。我假设您正确使用它(确保对象在创建后立即保存到某个 Cell 或其他 Cell 中,在构造函数完成和将指针存储在最终将被释放的某个位置之间没有失败的可能性)。如果是这样,您正在使用 RAII 的重要部分,即使它不是一个构造函数来完成这项工作。
这可能违反了单一责任原则。您已经让 Cell 负责表示一个单元格,并且还QAbstractGraphicsItem
负责管理这个对象的内存。更改representation_
为智能指针类型可能会简化事情,因此在 Cell 的析构函数中不需要任何特殊代码。
如果 Cell 不“拥有” 指向的对象representation_
,那么它本身也不会违反 RAII,它只是没有实现它。其他东西必须对对象的所有权负责。也许其他东西使用 RAII,也许它违反了它。为了确保对象只要 Cell 需要它就一直存在,它必须以某种方式参与到 Cell 的生命周期中(例如,如果它拥有该单元,那么你可能没问题)。因此,如果不是,则很有可能它以某种方式违反了 RAII。