C ++对象指针和范围

时间:2014-03-26 15:50:19

标签: c++ pointers scope

我对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)将会超出范围,所以这会给我一个指向什么的指针吗?

我希望我很清楚我想要做什么,我只是不确定如何正确编码。感谢任何帮助或建议。

感谢您的期待

4 个答案:

答案 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'指针将指向不确定状态的堆栈中的对象。在某些情况下,它可能仍然存在于有效的内存区域中,因此不会导致段违规,从而导致细微的错误。

看起来你还需要像'抽象工厂'这样的设计模式:

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

答案 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