Skip to content

Instantly share code, notes, and snippets.

@jmlvanre
Last active April 4, 2021 01:50
Show Gist options
  • Save jmlvanre/4b29c14fa7c9d52dde59 to your computer and use it in GitHub Desktop.
Save jmlvanre/4b29c14fa7c9d52dde59 to your computer and use it in GitHub Desktop.

shared_ptr in a class hierarchy

class Stream {
  public:
  virtual ~Stream() {}
  protected:
  class Data {
    protected:
    Data() {}
    virtual ~Data() {}
  };
  Stream(std::shared_ptr<Data>&& _data) : data(_data) {}
  private:
  std::shared_ptr<Data> data;
};

class Socket : public Stream {
  public:   
  virtual ~Socket() {}
  Stream NewSocket(const Node& node) {
    return Socket(std::make_shared<Data>(node));
  }
  private:
  class Data : public Stream::Data {
    public:
    Data(const Node& _node) : node(_node) {}
    virtual ~Data() {}
    private:
    const Node node;
  };
  Socket(std::shared_ptr<Data>&& data) : Stream(data) {}
};

Vs.

class StreamImpl {
  public:
  virtual ~StreamImpl() {}
  protected:
  StreamImpl() {} 
};
typedef std::shared_ptr<StreamImpl> Stream;

class Socket : public StreamImpl {
  public:
  Socket(const Node& _node) : node(_node) {}
  virtual ~Socket() {}
  private:
  const Node node;
};

Vs.

class Stream : public std::enable_shared_from_this<Stream> {
  public:
  Stream() {}
  virtual ~Stream() {}
};

class Socket : public Stream {
  public:
  std::shared_ptr<Socket> NewSocket(const Node& _node) {
    return std::make_shared<Socket>(_node);
  }
  virtual ~Socket() {}
  Future<size_t> write(const std::string& data) {
    self = shared_from_this();
    ...
  }
  private:
  Socket(const Node &_node) : node(_node) {}
  const Node node;
  std::shared_ptr<Stream> self;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment