Search code examples
c++smart-pointers

How to return a unique_ptr reference to a const type


I'd like a member function to return a unique_ptr reference to a const type, just like in raw pointers.

Here is what I mean:

class Foo {
   private:
      int _number;

   public:
      [[nodiscard]] explicit Foo(int number) : _number(number) {}
      [[nodiscard]] int number() const { return _number; }
      void set_number(int number) { _number = number; }
};

class ManageFoo {
   private:
      std::unique_ptr<Foo> foo_ptr;

   public:
      explicit ManageFoo(std::unique_ptr<Foo> &&foo_ptr) : foo_ptr(std::move(foo_ptr)) {};

      void set_number(const int &number) {
         foo_ptr->set_number(number);
         // And perform something else...
      }

      const Foo *getFoo() { return foo_ptr.get(); }
};

I want the user of ManageFoo to change the state of Foo only through ManageFoo's set_number. That's why I want getFoo to return a pointer to const Foo. I want the user to access only a read-only version of Foo. In order to avoid using foo_ptr.get() is it possible to write a getFoo returning std::unique_ptr<const Foo>& ?


Solution

  • void set_number(const int &number) {
      foo_ptr->set_number(number);
      // And perform something else...
    }
    

    foo_ptr never seems to get null. Then it can be like below to resolve your concerns in the comments.

    const Foo& getFoo() const { return *foo_ptr; }