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;
}
Мои проблемы являются:Указатель и абстрактный класс
Если я DonT свободный абс в деструкторе и пользователь забывает освободить свой объект, который реализует абстрактный или если пользователь сделать это таким образом
setAbs(new 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(), чтобы он передал копию аргумента?
Если нет другого способа, я просто позволю освободиться от работы пользователя.
Uh, 'std :: shared_ptr'? –
Обратите внимание, что 'Abstract' не имеет виртуального деструктора, поэтому' delete abs' вызывает неопределенное поведение. –