我对C ++的OO方面比较陌生,所以请原谅这个问题,我想这个问题相对简单;
我有一些代码,像这样松散
SuperClass* super;
if (useSub1())
{
SubClass1 sub1 (s);
super = &sub1;
}
else if (useSub2())
{
SubClass2 sub2 (s);
super = &sub2;
}
super.someMethod();
应该注意,这里的要点是'sub'的构造取决于对someFunction()的调用结果。 此外,将有多个if(...){}结构,如上所述,每个基于某些条件,基于SuperClass的不同SubClass创建不同的Object。
总之,然后SuperClass有许多子类,我想基于if条件创建适当的对象类型,然后使用'super'对象来操作它们。
这是我的问题,我认为通过做我所拥有的sub1(或者sub2)将会超出范围,所以这会给我一个指向什么的指针吗?
我希望我很清楚我想要做什么,我只是不确定如何正确编码。感谢任何帮助或建议。
感谢您的期待
答案 0 :(得分:2)
根据您问题中的信息,了解创作模式:工厂或工厂方法可能符合您的需求。
该设计模式允许在堆中动态创建对象,并且可以使用指向基类的指针对创建的对象进行操作。
为防止内存泄漏并正确处理资源,我建议您使用智能指针:
std::unique_ptr<Type>
或boost::shared_ptr<Type>
如果你打算使用std :: auto_ptr,请不要将它与容器一起使用
答案 1 :(得分:1)
@Ben表示:使用新的
SuperClass* super;
if (useSub1()) {
super = new SubClass1(s);
}
else if (useSub2()) {
super =new SubClass2(s)
}
super->someMethod();
答案 2 :(得分:0)
是的,sub1和sub2对象dors将在超出范围时被调用,而'super'指针将指向不确定状态的堆栈中的对象。在某些情况下,它可能仍然存在于有效的内存区域中,因此不会导致段违规,从而导致细微的错误。
看起来你还需要像'抽象工厂'这样的设计模式:
答案 3 :(得分:0)
您可以使用工厂方法:
std::unique_ptr<SuperClass> create(const std::string& name)
{
if (name == "Sub1")
return std::unique_ptr<SubClass1>{new SubClass1};
if (name == "Sub2")
return std::unique_ptr<SubClass2>{new SubClass2};
throw std::runtime_error;
}
我在这里使用了std::string
来选择要创建的对象的类型,但它可能是enum
。
请注意std::unique_ptr
自行管理对象的生命周期,因此无需delete
任何内容。
void foo()
{
auto object = create("SubClass1");
object->bar();
} <-- object is deleted automatically