一个类继承std::enable_shared_from_this代码示例
时间: 2024-06-09 17:08:48 浏览: 120
这是一个继承自`std::enable_shared_from_this`的类的代码示例:
```cpp
#include <memory>
class MyClass : public std::enable_shared_from_this<MyClass> {
public:
std::shared_ptr<MyClass> getShared() {
return shared_from_this();
}
};
int main() {
std::shared_ptr<MyClass> obj = std::make_shared<MyClass>(); std::shared_ptr<MyClass> sharedObj = obj->getShared();
return 0;
}
```
相关问题
C++ std::enable_shared_from_this用法
`std::enable_shared_from_this` 是一个模板类,其目的是为了解决在一个对象中保存 shared_ptr 的问题。它是 C++11 引入的一个特性。
在使用 `std::shared_ptr` 时,我们往往需要在对象中保存一个 `std::shared_ptr` 的副本,这样才能确保对象在使用完毕后不会被提前销毁。但是这种方式会导致一些问题,比如我们无法防止用户直接使用裸指针来操作对象,从而导致对象被提前销毁等问题。
这时候,我们可以使用 `std::enable_shared_from_this` 来解决这些问题。具体而言,我们需要继承 `std::enable_shared_from_this`,然后在对象中使用 `shared_from_this()` 方法来获取一个指向当前对象的 `std::shared_ptr`。
下面是一个示例代码:
```c++
#include <iostream>
#include <memory>
class MyClass : public std::enable_shared_from_this<MyClass>
{
public:
std::shared_ptr<MyClass> get_shared_ptr()
{
return shared_from_this();
}
};
int main()
{
std::shared_ptr<MyClass> p(new MyClass);
std::shared_ptr<MyClass> q = p->get_shared_ptr();
std::cout << "p.use_count() = " << p.use_count() << std::endl;
std::cout << "q.use_count() = " << q.use_count() << std::endl;
return 0;
}
```
在这个示例中,我们定义了一个名为 `MyClass` 的类,并且继承了 `std::enable_shared_from_this`。然后,我们在类中定义了一个名为 `get_shared_ptr()` 的方法,该方法使用了 `shared_from_this()` 方法来获取一个指向当前对象的 `std::shared_ptr`。在 `main()` 函数中,我们先创建了一个 `std::shared_ptr` 对象 `p`,然后通过 `p` 调用 `get_shared_ptr()` 方法获取了一个指向同一个对象的 `std::shared_ptr` 对象 `q`。最后,我们输出了 `p` 和 `q` 的引用计数,可以看到它们的引用计数都是 2。
需要注意的是,在使用 `std::enable_shared_from_this` 时,我们需要确保对象已经被一个 `std::shared_ptr` 管理,否则使用 `shared_from_this()` 方法会导致程序崩溃。
怎么使用enable_shared_from_this
使用enable_shared_from_this需要遵循以下步骤:
1. 定义一个类并继承自std::enable_shared_from_this<T>
2. 在类的构造函数中,将this指针传递给std::shared_ptr<T>对象。
3. 在需要使用shared_from_this()的地方,调用该函数,并将返回值赋值给一个std::shared_ptr<T>对象。
以下是一个示例代码:
```
#include <memory>
#include <iostream>
class MyClass : public std::enable_shared_from_this<MyClass>
{
public:
MyClass(int val) : m_val(val) {}
std::shared_ptr<MyClass> getShared()
{
return shared_from_this();
}
int getValue() const
{
return m_val;
}
private:
int m_val;
};
int main()
{
std::shared_ptr<MyClass> ptr1(new MyClass(10));
std::shared_ptr<MyClass> ptr2 = ptr1->getShared();
std::cout << "ptr1 value: " << ptr1->getValue() << std::endl;
std::cout << "ptr2 value: " << ptr2->getValue() << std::endl;
return 0;
}
```
在这个例子中,我们定义了一个名为MyClass的类,这个类继承自std::enable_shared_from_this<MyClass>。在类的构造函数中,我们将this指针传递给std::shared_ptr<MyClass>对象。在getShared()函数中,我们调用shared_from_this()函数,并将返回值赋值给一个std::shared_ptr<MyClass>对象。
最后,我们创建了两个std::shared_ptr<MyClass>对象,一个是直接使用new操作符创建的,另一个是通过getShared()函数获取的。我们输出了这两个对象的值,可以看到它们都指向同一个对象,并且该对象的值为10。这说明了两个std::shared_ptr<MyClass>对象共享同一个对象。
阅读全文