struct Abstract{
virtual void methodA() = 0;
};
struct Test : public Abstract{
virtual void methodA(){
printf("Test message");
}
};
class Foo{
Abstract* abs; //I made it this way so that an instance of Foo
//can easily switch between any class that implements
//Abstract
public:
virtual ~Foo(){
delete abs; //free abs
}
void setAbs(Abstract* a){
abs = a; //is there any other way to do this?
}
void changeAbs()//method to switch abs
void show(){
abs->methodA();
}
};
int main(){
Test *test = new Test();
// Test test; //local instantiation will throw a segmentation fault
//because abs is freed in the desctructor of Foo
Foo foo;
foo.setAbs(test);
foo.show();
// delete test; //using a pointer is fine unless freed
return 0;
}
我的担忧是:
如果我没有在析构函数中释放 abs 并且用户忘记释放他的实现 Abstract 的对象,或者如果用户这样做
setAbs(new Test())
,就会有泄漏。如果我在析构函数中释放 abs ,如果用户在本地实例化Test或者他使用指针并最终自己删除它,它将引发分段错误。
Abstract abs
也不允许,因为它是一个抽象类
我想将 setAbs() 更改为如下内容:
void setAbs(Abstract* a){
abs = new Abstract(*a); //but copying like a normal class doesn't work on abstract classes
}
我的问题是,有没有其他方法可以实现 setAbs() 以便复制传递的参数?
如果没有其他办法,我会让释放成为用户的工作。