c++ - 使用智能指针的 OOP 父/子关系
问题描述
我正在尝试学习如何有效地使用智能指针,并在更“OOP”的意义上进行编程。
基本上我遇到的问题如下:
// base class example
class class_a {
public:
virtual void func( ) = 0;
std::shared_ptr< class_a > m_parent;
std::vector< std::shared_ptr< class_a > > m_children { };
void add_child( std::shared_ptr< class_a > a ) {
m_parent = this; // here! how could I go about this?
m_children.emplace_back( a );
}
};
// derived class example
class class_b : public class_a {
int m_var { };
public:
class_b( int param ) : m_var( param ) { }
void func( ) override {
// stuff
}
};
/*
* elsewhere
*/
auto parent = std::make_shared< class_b >( 14 );
{
// class_c inherits 'class_a' like 'class_b'
auto child = std::make_shared< class_c >( 6 );
{
// more children
}
parent->add_child( child );
}
问候。
解决方案
您似乎正在尝试将新孩子“连接”到其父母。
然后只需为子内部变量分配一个引用。
a->m_parent = this;
正如其他人指出的那样,使用weak_ptr而不是共享指针来保存来自您的孩子(ren)的父引用,否则在删除您的父节点时,父节点仍然会从孩子那里保持活动状态,而不是被垃圾收集。
推荐阅读
- python - 在 python 上的矩阵侧面创建条形图
- windows - 如何在 Windows 上的 GitKraken 中指定 ssh 自定义端口?
- javascript - Dragula 和 Angular 5 - 通过拖放更新对象位置值
- php - 持续时间之间的差异
- machine-learning - SVM 分类器边缘内的点是否也支持向量?
- textbox - 谁将文本框限制为单词列表,不承认任何其他
- hyperledger - Composer-Rest-Server 在我的概念中生成了一个额外的 id 字符串
- entity-framework - 在实体框架中为不同的上下文设置不同的执行策略
- vuejs2 - 图片未显示(VueJS - 使用 v-for)
- scala - 如何对 Spark 数据框中的记录组执行任意计算?