【问题标题】:How can I access member function of a class via a shared ptr to a shared ptr?如何通过共享 ptr 访问类的成员函数到共享 ptr?
【发布时间】:2020-09-11 10:40:29
【问题描述】:

我有两个类,foobar,其中bar 包含指向foo 的指针,如下所示。

#include<iostream>
#include<memory>
class foo {
private:
  int num{4};
public:
  void sum(const int& to_add) {num += to_add;}
  int access_num() {return num;}
};
class bar {
private:
  std::shared_ptr<foo> ptr;
public:
  void change_ptr(foo& f) {
    auto new_ptr = std::make_shared<foo>(f);
    ptr = std::move(new_ptr);
  }
  std::shared_ptr<foo> access_ptr() { return ptr; }
};

如果我想通过bar中的指针执行foo的成员函数sum(),该怎么做? 目前,正在尝试

  foo f;
  std::shared_ptr<bar> bar_ptr = std::make_shared<bar>();
  bar_ptr->change_ptr(f);
  // Add three to the int stored in f via the pointer
  bar_ptr->access_ptr()->sum(3);
  std::cout << f.access_num() << std::endl;

不工作,输出4。

【问题讨论】:

  • 在您的示例中,bar 对象中的shared_ptr 不指向fchange_ptr 创建一个新的 foo 对象。这是它应该如何工作的?
  • 不,不是这样,那将是我出错的地方。如何在不创建新对象的情况下创建指向 f 的指针?
  • foo *pf = &amp;f;
  • @scs-erin auto new_ptr = ptr
  • 一般来说,您不能创建指向现有对象的共享指针,因此您可能需要重新考虑您的change_ptr(foo&amp; f) 接口。用change_ptr(shared_ptr&lt;foo&gt; f) 替换它怎么样?

标签: c++ pointers shared-ptr


【解决方案1】:

这段代码

void change_ptr(foo& f) {
    auto new_ptr = std::make_shared<foo>(f); // copy constructor
    ptr = std::move(new_ptr);
}  

调用复制构造函数在堆上创建foo 的实例并使用std::shared_ptr 对其进行管理。如果您在 foo 声明中删除复制构造函数,则可以检查它。代码不会编译。请注意,您必须至少提供一个默认构造函数,因为如果您明确删除了复制构造函数,零规则将不起作用。

class foo {
private:
    int num{4};
public:
    foo() = default;
    foo(foo const &other) = delete;
    void sum(const int& to_add) {num += to_add;}
    int access_num() {return num;}
};

foo f 是存储在堆栈中的自动变量。用std::shared_ptr 管理它没有多大用处。您可能需要在堆上创建一个 foo 实例并使用 std::shared_ptr 来处理它:

#include<memory>

class foo {
private:
    int num{4};
public:
    void sum(const int& to_add) {num += to_add;}
    int access_num() {return num;}
};

class bar {
private:
    std::shared_ptr<foo> ptr;
public:
    void change_ptr(std::shared_ptr<foo> f) {
        ptr = std::move(f); // f is already a copy, so we can safely move it
    }
    std::shared_ptr<foo> access_ptr() { return ptr; }
};

int main() {
    auto f = std::make_shared<foo>();
    std::shared_ptr<bar> bar_ptr = std::make_shared<bar>();
    bar_ptr->change_ptr(f);
    bar_ptr->access_ptr()->sum(3);
    std::cout << f->access_num() << std::endl;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    相关资源
    最近更新 更多