现代 C++ 中作为类成员的非拥有指针

Non-owning pointer as class member in modern c++

本文关键字:拥有 指针 成员 C++ 现代      更新时间:2023-10-16

我一直在研究智能指针以及何时应该使用它们与原始指针。我的结论是,拥有指针的对象应该将该指针实例化为智能指针(unique_ptr/shared_ptr(。

然后,当将该指针传递给不需要所有权的各种函数/类时,传递一个原始指针(通过.get()从智能指针获得(,但需要注意的是,原始指针发送到的函数/类永远不会超过拥有它的函数/类的范围。

这种理解正确吗?这对我来说似乎是有道理的,但是当我开始实施特定的例程时,我的信心就下降了。

下面的代码将更好地解释我的挂断当前在哪里。我有一个unique_ptrs 的成员向量来MeshScene中的对象。然后,我传递所创建unique_ptr的原始指针来实例化Actor对象,最后将unique_ptr移动到scene->meshes向量中。

只要任何一个Actor的范围永远不会超过拥有scene->meshes要素的范围,Actor作为成员拥有Mesh*,这一事实难道不被视为不良做法吗?

#include <iostream>
#include <vector>
#include <memory>
class Mesh
{
public:
int vec = 1;
int ind = 2;
};
class Actor
{
private:
Mesh * mesh;
public:
Actor(Mesh* m) {
this->mesh = m;
}
};
class Scene
{
public:
// meshes will always outlive all instantiated actors
std::vector<std::unique_ptr<Mesh>> meshes;
std::vector<Actor> actors;
};

int main()
{
auto scene = std::make_unique<Scene>();
auto m1 = std::make_unique<Mesh>();
auto a1 = Actor(m1.get());
scene->meshes.push_back(std::move(m1));
auto m2 = std::make_unique<Mesh>();
auto a2 = Actor(m2.get());
scene->meshes.push_back(std::move(m2));
std::cout << scene->meshes.size();
std::cin.get();
return 0;
}

Actor将Mesh*作为成员的事实不被认为是不良做法,只要......

当然,这是一种代码气味。该类很容易被滥用。必须仔细记录构造函数在Actor的生存期内存储指针,以提醒用户维护尖网格的生存期。

在这种情况下,共享所有权会更安全。但是,如果性能开销很大,它并不总是最佳选择。

这是正确的,但非常丑陋。

您可以考虑使用第三个类来实现该关系,以及作用于此关系的任何操作。

某种控制器。