c++对象指针和作用域
C++ Object Pointers and 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的不同子类创建一个不同的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
相关文章:
- 全局作用域中函数指针的赋值
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- 如何从类函数返回指向类作用域数组的指针?
- 块作用域中的函数指针定义
- c++ 指针在离开作用域后不会停留
- 混合指向已分配对象和作用域对象的指针
- 在一个作用域中推送五个对象指针,然后检查对象的布尔值是否为 false,会给出错误
- 空的唯一指针在离开作用域时调用析构函数
- 使用作用域内生成的指针初始化静态成员
- 提升::进程间managed_shared_memory指针有效作用域
- 什么是C++中的作用域指针
- 在释放了所有作用域内指针之后仍然可访问内存
- C++指针到指针作用域的问题
- 模板类中静态函数或指针的作用域解析
- 有没有一种方法可以通过使用指针来处理作用域
- 关于 C++(或 C)中的指针的函数作用域
- Boost作用域指针指向Boost线程
- 当类没有析构函数时,智能指针或作用域指针会删除对象吗
- 如何在作用域指针类中正确使用动态分配的不透明指针
- 如何传递作用域指针而不是this指针