我希望一个超类的所有子类都能执行类似的操作。所以我想我可以在超类中有一个方法来实现。这个动作需要发送一个自身的副本(或shared_ptr到)作为方法的参数。但我不知道这样的事情是否可行,如果可行,应该怎么做。
为了澄清我的问题,请考虑下面的例子。我希望打印出来的是 "Child "和 "Parent"。目前的代码打印出的是 "Parent "和 "Parent"。当然这也是这个代码的预期,因为我在make_shared里面把复制*this作为Parent类型返回。
问题是我能否得到预期的行为。请注意,在实际情况中,有很多子类型,所以在每个子类型中实现函数getPtr()不是那么容易。
谢谢你的帮助。
class Parent
{
public:
std::shared_ptr<Parent> getPtr() { return std::make_shared<Parent>(*this); } // I tried make_shared<decltype(*this)> also, but the code does not compile.
virtual void printName() const { std::cout << "Parent\n"; }
};
class Child1 : public Parent {
void printName() const override { std::cout << "Child\n"; }
};
int main() {
Child1 c;
auto cPtr = c.getPtr();
cPtr->printName(); // I want this to print "Child", but it prints "Parent" (as expected)
Parent p;
auto pPtr = p.getPtr();
pPtr->printName();
}
虽然不完全清楚你在做什么,但你肯定想派生出你的超级类。Parent
从 std::enable_shared_from_this
.
这将给你一个成员函数 shared_from_this()
(这也是您想通过以下方式实现的目标) getPtr()
).
然而,必须强调的是,你的 Parent
对象本身必须由 std::shared_ptr
. 也就是说,只有在以下情况下,这种做法才会有效
std::shared_ptr<Parent> p = std::make_shared<Parent>();
那么你可以使用 p->shared_from_this()
给你一个共享指针。