c++ - 复制并修改一个shared_ptr

标签 c++

我想知道如何“复制”一个 shared_ptr 并修改其内容。

在下面的示例中,创建了一个“模板人”,我想将其用作每个人都会从中复制的“人”。但是,当 std::shared_ptr p2 被分配给 template_person 时,p2 中的每个修改也会影响 template_person。有没有办法避免这种情况,或者我应该使用普通指针?

这是我的第一种方法。我想这样做是为了消耗更少的内存。

#include <iostream>
#include <memory>
#include <string>

class Person{
public:
    ~Person() {}
    Person(int a, std::string b) : age_(a), name_(b) {}

    void set_age(int x) { age_ = x; }
    int age() { return age_; }

private:
    int age_;
    std::string name_;
};

int main () {

    std::shared_ptr<Person> template_person = std::make_shared<Person>(10, "test");

    std::shared_ptr<Person> p2 = template_person;

    p2->set_age(20);

    std::cout << p2->age() << " " << template_person->age() << std::endl;
    //prints 20 20

    return 0;
}

最佳答案

使用复制构造函数:

auto p2 = std::make_shared<Person>(*template_person);

关于c++ - 复制并修改一个shared_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50600316/

相关文章:

c++ - "term does not evaluate to a function taking 0 arguments"错误

c++ - 如何添加一个整数的所有数字直到它是一位数字?

c++ - 快速排序错误 : stack around the variable was corrupted?

c++ - 无法理解线程示例的输出

c++ - std::upper_bound 在空结束范围内的定义行为是什么?

c++ - 设置一个项目,该项目将使用和不使用预编译头文件进行编译

C++ 代码翻译和名称查找

c++ - 如何处理 DirectX 11 驱动程序崩溃

c++ - 确定平台的行分隔符的可移植方法

c++ - 如何将基类的枚举传递给子类的构造函数