У меня есть простой класс контейнера, который указывает на абстрактный класс, и у меня есть функции для получения/установки указателя в классе контейнера. Более конкретно, класс выглядит следующим образом:C++ Добавить производный объект абстрактного класса в другой класс без оборванных указателей?
class Container
{
Abstract* thing;
public:
void set(Abstract &obj)
{
thing = &obj; //danger of dangling pointer
}
Abstract* get()
{
return thing;
}
};
Abstract
является абстрактным классом. Как уже видно, существует опасность свисающего указателя. Я знаю, что могу сделать копию объекта (новый), а затем указать на него. Но я не могу создать экземпляр абстрактного класса. Какие существуют решения для этого?
Ниже приводятся лишь дополнительная информация:
Определения классов
class Abstract
{
public:
virtual void something() = 0;
};
class Base : public Abstract
{
int a;
public:
Base() {}
Base(int a) : a(a){}
virtual void something()
{
cout << "Base" << endl;
}
};
class Derived : public Base
{
int b;
public:
Derived() {}
Derived(int a, int b) : Base(a), b(b){}
virtual void something()
{
cout << "Derived" << endl;
}
};
Простые тесты
void setBase(Container &toSet)
{
Base base(15);
toSet.set(base);
}
void setDerived(Container &toSet)
{
Derived derived(10, 30);
toSet.set(derived);
}
int main()
{
Container co;
Base base(15);
Derived derived(10, 30);
Base *basePtr;
Derived *derivedPtr;
//This is fine
co.set(base);
basePtr = static_cast<Base *>(co.get());
basePtr->something();
//This is fine
co.set(derived);
derivedPtr = static_cast<Derived *>(co.get());
derivedPtr->something();
//Reset
basePtr = nullptr;
derivedPtr = nullptr;
//Dangling pointer!
setBase(co);
basePtr = static_cast<Base *>(co.get());
basePtr->something();
//Dangling pointer!
setDerived(co);
derivedPtr = static_cast<Derived *>(co.get());
derivedPtr->something();
return 0;
}
Уход за разделом причины downvote? – silentwf
Возможный дубликат [Что такое умный указатель и когда его использовать?] (Http://stackoverflow.com/questions/106508/what-is-a-smart-pointer-and-when-should-i-use -one) – LogicStuff
@silentwf Приоритетные причины разделяются во всплывающей подсказке, когда вы наводите указатель мыши на указатель мыши. –