在 C++ 中是否有可能在超类中有一个方法,当每个子类 returns 调用该子类的 shared_ptr 时?
Is it possible in C++ to have a method in the superclass that when called by each subclass returns a shared_ptr to that subclass?
我希望超类的所有 children 都执行类似的操作。所以我想我可以在超类中有一个方法来这样做。该操作需要将自身的副本(或 shared_ptr 发送给)作为方法的参数。但是我不知道这样的事可不可以,如果可以,应该怎么做。
为了澄清我的问题,请考虑以下示例。我希望打印输出为 "Child" 和 "Parent"。当前代码打印出 "Parent" 和 "Parent"。当然,这是从这段代码中得到的,因为我正在返回复制 *this 作为 make_shared.
中的 Parent 类型
问题是我是否可以获得预期的行为。请注意,在实际情况下,有很多 children,因此在每个案例中实现函数 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();
}
不完全清楚你在做什么,但你肯定想从 std::enable_shared_from_this
派生你的 Parent
。
这将为您提供一个成员函数 shared_from_this()
(这或多或少是您想通过 getPtr()
实现的)。
但是,必须强调您的 Parent
对象本身必须由 std::shared_ptr
管理。即,这仅在
时有效
std::shared_ptr<Parent> p = std::make_shared<Parent>();
那你可以用p->shared_from_this()
给你一个共享指针
我希望超类的所有 children 都执行类似的操作。所以我想我可以在超类中有一个方法来这样做。该操作需要将自身的副本(或 shared_ptr 发送给)作为方法的参数。但是我不知道这样的事可不可以,如果可以,应该怎么做。
为了澄清我的问题,请考虑以下示例。我希望打印输出为 "Child" 和 "Parent"。当前代码打印出 "Parent" 和 "Parent"。当然,这是从这段代码中得到的,因为我正在返回复制 *this 作为 make_shared.
中的 Parent 类型问题是我是否可以获得预期的行为。请注意,在实际情况下,有很多 children,因此在每个案例中实现函数 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();
}
不完全清楚你在做什么,但你肯定想从 std::enable_shared_from_this
派生你的 Parent
。
这将为您提供一个成员函数 shared_from_this()
(这或多或少是您想通过 getPtr()
实现的)。
但是,必须强调您的 Parent
对象本身必须由 std::shared_ptr
管理。即,这仅在
std::shared_ptr<Parent> p = std::make_shared<Parent>();
那你可以用p->shared_from_this()
给你一个共享指针