我认为您需要 shared_ptr 和 unique_ptr 的组合。策略类型应该在您的基类之一中,并且您应该根据需要使用共享/唯一 ptr,现在这里是 unique_ptr。这样您就可以确定重新分配不会泄漏或更好地检查它是否已经分配。
显然,您不希望成员变量公开,但在这里它们是为了演示。
#include <memory>
class StrategyType
{};
class PersonBase
{
public:
std::unique_ptr<StrategyType> strat;
};
class Person : public PersonBase
{
public:
void do_something()
{
double d = 0;
d = d + 9;
d = d * d;
}
};
class Parser
{
public:
// makes no sense in moving shared_ptr
// hence pass by value
Parser(std::shared_ptr<Person> _person)
:m_person(_person)
{
// probably want to use a unique_ptr for strat, but one thing at a time
m_person->strat.reset(new StrategyType);
}
private:
std::shared_ptr<Person> m_person;
};
int main()
{
auto person = std::make_shared<Person>();
{
Parser parser(person);
// parser shares person
}
// parser is destroyed, but person lives on
person->do_something();
}