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()を実装する他の方法はありますか?
他に方法がない場合は、ユーザーの仕事を解放するだけにします。