如何访问 std::shared_ptr 的内容?

How do I access the contents of a std::shared_ptr?

这是我的代码。

std::shared_ptr<WSUStudent> WSUStudent::registerStudent(
   std::string lastName,
   std::string firstName
)
{
   auto result = std::shared_ptr<WSUStudent>(new WSUStudent(lastName, firstName));

   s_allStudents.insert(&result);

   return result;
}

我已经成功地更改了函数,因此它 returns 是 shared_ptr 而不是普通指针。根据赋值(我认为),我已经成功地用共享指针封装了 'new' 语句,但是 'auto' 下面的代码行没有 & 就不能工作,而且它也不能工作与 &。我收到一条错误消息,指出没有匹配的函数调用,无论是否带有 &。该行代码试图将新学生(或指向新学生的指针?)插入所有学生的列表中。但是 'insert' 方法没有在本地被覆盖,所以我不太确定在这里做什么。下面打印错误。

/mnt/hgfs/Data Structures and Algorithms/HW04/WSUStudent.cpp:146:32: error: no matching function for call to ‘std::set<WSUStudent*>::insert(std::shared_ptr<WSUStudent>*)’
    s_allStudents.insert(&result);

这个赋值的重点是通过将普通指针转换为弱指针和共享指针来修复内存泄漏('new' 语句不会随指针一起删除)。原代码如下

WSUStudent *WSUStudent::registerStudent(
   std::string lastName,
   std::string firstName
)
{
   auto result = new WSUStudent(lastName, firstName);

   s_allStudents.insert(result);

   return result;
}

我做错了吗?我无法将 s_allStudents 行设置为 运行。

鉴于 s_allStudents 的类型,您可以使用:

s_allStudents.insert(result.get());

但是,更好的选择是更改 s_allStudents 的类型。

static std::set<std::shared_ptr<WSUStudent>> s_allStudents;

并使用:

s_allStudents.insert(result);

更新

shared_ptr 的默认 operator<()s_allStudents 中的对象将按指针值排序。如果您想使用不同的标准对对象进行排序,您需要定义自定义 functor/function 作为模板的参数。

struct MyCompare
{
   bool operator<(shared_ptr<WSUStudent> const& lhs,
                  shared_ptr<WSUStudent> const& rhs) const
   {
      // Implement the logic ...
   }
};

并将其用作:

static std::set<std::shared_ptr<WSUStudent>, MyCompare> s_allStudents;

如果您要 return std::shared_ptr<WSUStudent> 那么您将 return 拥有对您创建的对象的 所有权 - 意思是某人否则将在某个时候尝试删除它。

除非你保持所有权,这意味着你的指针可能会在你之前删除完成它。因此,您还需要将 std::shared_ptr 存储在 static 集合中:

我猜你是如何使用这个的 class 但我的意思是这样的:

class WSUStudent
{
    // you really need to store shared pointers in here
    static std::set<std::shared_ptr<WSUStudent>> s_allStudents;

    std::string lastName;
    std::string firstName;

    // only the static factory function can make students
    WSUStudent(
        const std::string& lastName, // passing by const& is more usual (idiomatic)
        const std::string& firstName)
    : lastName(lastName)
    , firstName(firstName)
    {
    }

public:

    static std::shared_ptr<WSUStudent> registerStudent(
        const std::string& lastName,
        const std::string& firstName);
};

std::shared_ptr<WSUStudent> WSUStudent::registerStudent(
    const std::string& lastName,
    const std::string& firstName
)
{
    auto result = std::shared_ptr<WSUStudent>(new WSUStudent(lastName, firstName));

    // put the shared student in your set
    s_allStudents.insert(result);

    return result;
}

// define your set
std::set<std::shared_ptr<WSUStudent>> WSUStudent::s_allStudents;

int main ()
{
    // make students
    auto s = WSUStudent::registerStudent("bill", "bob");
    // all deletions should be in order
}