我有一个二维的细胞矩阵.通常只有不可见的算法才能使用这些单元格.但有时我想要显示每个单元格,所以我添加了一个指向图形对象的指针
class Cell
{
...
QAbstractGraphicsItem* representation_;
...
}
Run Code Online (Sandbox Code Playgroud)
Cell的构造函数将representation_设置为0.有时,另一个Visualization类在矩阵上迭代,并向Cells添加元素,以按颜色可视化每个单元格的内容.
我认为这打破了RAII范式.你有更好的方法吗?
我可以创建另一个二维矩阵,并从那里链接到原始矩阵,以便指针在可视化方面,但我需要两个矩阵.
RAII被误称,正如(我认为)Scott Meyers指出的那样.
它不应该被称为"资源获取是初始化",它应该被称为"销毁是资源释放".但我们就在这里.
如果小区"拥有"指向的对象representation_,并删除在其析构函数,那么这仍然是RAII的一种形式,你可以初始化一个同样的方式shared_ptr用一个空指针,后来将它设置为别的东西.我假设你使用正确的(确保对象保存到一些小区或其他被创建后,立即用构造的完成和指针的存储某个地方,这最终会被释放之间没有机会失败).如果是这样,你正在使用RAII的重要部分,即使它不是构造函数来完成工作.
这可能违反了单一责任原则.你让Cell负责表示一个单元格,也负责内存管理这个QAbstractGraphicsItem对象.它可能会简化更改representation_为智能指针类型的事情,因此在Cell的析构函数中不需要任何特殊代码.
如果小区不"拥有"指向的对象representation_,那么这本身并没有违反任何RAII,它只是没有实现它.其他东西必须负责对象的所有权.也许其他东西使用RAII,也许它违反了它.为了确保该对象的生活的东西,只要细胞都需要它,它都必须在Cell(举例来说,如果它拥有的电池,那么你可能被罚款)的生命周期以某种方式参与其中.所以如果不是这样的话,很可能会以某种方式违反RAII.