#include <memory>
#include <iostream>
 
class myObject {
public:
    myObject(int a, int b) {
        m_sum = a + b;
    }
    int getSecret() const { return m_secret; }
    void setSecret(int n) { m_secret = n;    }
    int getSum()    const { return m_sum;    }
private:
    int m_secret = 69;
    int m_sum;
};
 
int myFunc(std::unique_ptr<int>& somePtr) {
    return (*somePtr)++;
}
 
std::unique_ptr<int> myOtherFunc(std::unique_ptr<int> somePtr) {
    std::cout << "Inside: " << *somePtr << std::endl;
    return somePtr;
}
 
int main() {
    std::unique_ptr<int> myPtr = std::make_unique<int>(69);
    std::unique_ptr<myObject> myOtherPtr = std::make_unique<myObject>(12, 13);
    std::unique_ptr<myObject> anotherPtr(new myObject(13, 13));
 
    std::cout << myOtherPtr->getSum() << std::endl;
    std::cout << anotherPtr->getSum() << std::endl;
 
    // Passing by reference, no change in ownership
    myFunc(myPtr);
 
    std::cout << *myPtr << std::endl;
 
    // Transferring ownership to myOtherFunc then taking ownership back
    myPtr = myOtherFunc(std::move(myPtr));
 
    std::cout << *myPtr << std::endl;
 
    return 0;
}