我正在编写一个模块化的软件,我正在解决接口和内存方面的一些问题。向下转换const std :: list <const unique_ptr <Base>>
我有一个Base
类与关联和组成一些繁重的工作,所以我宁愿写它在接口一次。问题是要避免任何内存泄漏或问题,只有我的基类应该能够看到字段。除Base
之外的其他人都不应修改mFields
列表或释放其包含的指针。
问题是BaseField
将衍生和方法将被添加和我谁将会使用Derived
方法程序应直接获得DerivedField
名单:
class BaseField {} ;
class DerivedField : public BaseField {} ;
class Base {
protected:
unique_ptr<BaseField> & addField(unique_ptr<BaseField> f) ;
const unique_ptr<BaseField> & something() ;
const unique_ptr<BaseField> & something2() ;
const std::list<const unique_ptr<BaseField>> & getFields() ;
private:
std::list<const unique_ptr<BaseField>> mFields ;
}
class Derived : public Base {
public:
unique_ptr<DerivedField> & addField(params) ;
const unique_ptr<DerivedField> & something() ;
const unique_ptr<DerivedField> & something2() ;
const std::list<const unique_ptr<DerivedField>> & getFields() ;
}
所以我的问题是如何获得 const std::list<const unique_ptr<DerivedField>> &
在Derived::getFields()
与Base::getFields()
?
编辑:
我想我没有清楚地解释我的问题。我明白了什么是@NicolBolas说,我agreee他,但并没有真正帮助我让我们提出这样的说法:
我的软件应该解决不同的问题类型,如Problem1
Problem2
和Problem3
事实是放入系统的所有问题,具有完全相同相同的子结构,如SubProblem1
SubProblem2
SubProblem3
因此,为了避免重复代码,我决定写一个BaseProblem
类和BaseSubProblems
谁将会参阅下文为每一个问题(如addSubProblem(BaseSubProblem *)
)的结构和COMON操作。
因为受保护的构造函数(它只是提供避免代码重复的结构),所以基本问题不是可实现的。另外,addSubProblem(SubProblem *)
法保护的,所以只有derived
Problem
可以因为谁创建Problem1
知道所有包含在Problem1
子问题是SubProblem1
类型,每个用户的增加SubProblem
。
所以其实我在BaseProblem
使用std::list<SubProblem *>
和我derived Problem class
给出了std::list<SubProblem1 *> Problems1::getSubProblems()
访问,我想能够声明只BaseProblem
拥有SubProbblems
即使只有derived Problems
知道真正的类型的
我希望这个解释比以前更好。
这不是一个答案,但你应该使用'std :: list>'而不是'std :: list >''。我也想知道你为什么要返回'const unique_ptr &'而不是'T *'。 –
Simple
事实是,我真的不希望任何人都可以接受我的DerivedField的所有权。我100%确定所有'BaseField'都是'DerivedField'。 –