add smart pointer
add override operator