gpt4 book ai didi

具有模板类和动态调度的 C++ 共享指针

转载 作者:行者123 更新时间:2023-11-28 01:24:10 28 4
gpt4 key购买 nike

我有一段 C++ 代码,我在其中尝试在派生类上创建 shared_pointer。创建 shared_pointer 后,动态调度停止工作。

我的代码:

#include <iostream>
#include <memory>

using namespace std;

template <typename T>
class Base
{
public:
virtual void print()
{
cout << "Print from Base" << endl;
}

};

template <typename T>
class Child : public Base<T>
{
public:
virtual void print()
{
cout << "Print from Child" << endl;
}
};

template <typename T>
class TestClass: public Base<T>
{
public:
TestClass<T> (Base<T> &b)
{
b.print();
shared_ptr<Base<T>> sptr = make_shared<Base<T>> (b);
sptr->print();
}
};

int main()
{
Child<int> child;
TestClass<int> cl(child);
}

TestClass 的复制构造函数中,我首先调用了print() 方法,它工作得很好。创建 shared_pointer 后,该方法将引用基类。

输出如下:

Print from Child
Print from Base

问题:如何创建共享指针而不丢失动态调度功能?

最佳答案

make_shared不共享现有的东西;它会根据您提供的类型创建一个新的共享对象。

它实际上是这样的(仅限伪代码!):

template <typename T>
shared_ptr<T> make_shared(Args...)
{
shared_ptr<T> newPtr = new T(args...);
return newPtr;
}

在这种情况下,您正在创建一个 Base<int> ,那将被分享。它不是任何东西的 child 。这是你的 Child<int> 的切片拷贝.

TestClass 中没有任何内容知道你想要一个 Child<int> ,甚至知道 Child<int>作为一种类型存在。

你可以做 shared_ptr<Base<T>> sptr = &b获取现有对象的 shared_ptr。不幸的是,所述对象不是动态分配的,因此不会顺利进行。

与您的对象所有权语义保持一致确实会更好。你的main功能可以做到auto ptr = make_shared<Child<int>>() ,然后将生成的共享指针传递给任何需要 shared_ptr<Child<int>> 的东西或 shared_ptr<Base<int>> .

在不知道您实际尝试做什么的情况下,我无法提出任何更具体的建议。

关于具有模板类和动态调度的 C++ 共享指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54736826/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com