#include #include #include using std::string, std::unique_ptr, std::shared_ptr, std::make_unique; class BadRef { string &name; public: BadRef(string &name) : name(name) {} void set_name(string &n) { name = n; } }; class GoodRef { string *name; public: /* * After calling, name is owned. */ GoodRef(string *n) : name(n) {} void print() { std::cout << "My name is " << *name << std::endl; } }; int main() { string my_name = "Zed"; string your_name = "Alex"; string &ref_test = my_name; string *ptr_name = new string("Pointer"); ref_test = your_name; auto br = BadRef(my_name); br.set_name(your_name); auto gr = GoodRef(ptr_name); gr.print(); return 0; }