c++对象指针和作用域

C++ Object Pointers and Scope

本文关键字:作用域 指针 对象 c++      更新时间:2023-10-16

我对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的不同子类创建一个不同的Object。

总而言之,SuperClass有许多子类,我想基于if条件创建适当的对象类型,然后使用'super'对象来操作它们。

这是我的问题,我认为通过做我有sub1(或sub2)将超出范围,所以这是否留给我一个指针指向什么?

我希望它是相当清楚我想做什么,我只是不确定如何正确地编码它。如有任何帮助或建议,不胜感激。

感谢期待

根据问题中的信息阅读创建模式:工厂或工厂方法可能适合您的需要。

该设计模式允许在堆中动态创建对象,并且可以使用指向基类的指针对创建的对象进行操作。

为了防止内存泄漏和正确处理资源,我建议您使用智能指针:std::unique_ptr<Type>boost::shared_ptr<Type>
如果你要使用std::auto_ptr,不要在容器中使用

如@Ben所示:使用new

SuperClass* super;
if (useSub1()) {
    super = new SubClass1(s);
}
else if (useSub2()) {
    super =new SubClass2(s)
}
super->someMethod();

是的,sub1和sub2对象将在超出作用域时被调用,并且'super'指针将留在指向处于不确定状态的堆栈中的对象。在某些情况下,它可能仍然在有效的内存区域中,因此不会导致段冲突,从而导致一个微妙的错误。

看起来你还需要一个类似于"抽象工厂"的设计模式:

http://en.wikipedia.org/wiki/Abstract_factory_pattern

可以使用工厂方法:

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