Невозможно выделить указатель, используя `std :: make_shared` - PullRequest
0 голосов
/ 07 ноября 2019

У меня возникли проблемы с пониманием того, в чем разница с точки зрения создания new объекта абстрактного класса с использованием std::make_shared и std::shared_ptr? Так что в моем конкретном случае я не могу использовать это:

p_network_connection_ = std::make_shared<awsiotsdk::NetworkConnection> (awsiotsdk::ConfigCommon::endpoint_);

Но я могу сделать это:

p_network_connection_ = std::shared_ptr<awsiotsdk::NetworkConnection>(new awsiotsdk::network::WebSocketConnection(awsiotsdk::ConfigCommon::endpoint_);

Почему? Как будто я пробую первый метод (используя std::make_shared), я получаю эту ошибку:

 error: invalid new-expression of abstract class type ‘awsiotsdk::NetworkConnection’
  { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }

1 Ответ

2 голосов
/ 07 ноября 2019

Хм, похоже, вы создаете экземпляры разных классов. В первом примере вы пытаетесь создать экземпляр класса awsiotsdk::NetworkConnection. Учитывая ошибку, я могу предположить, что это абстрактный класс - и, следовательно, экземпляр этого не может быть создан. Во втором примере вы создаете экземпляр класса new awsiotsdk::network::WebSocketConnection. Учитывая, что это «работает» для вас - это не класс абстракции:)

Так почему бы не попробовать:

p_network_connection_ = std::make_shared<awsiotsdk::network::WebSocketConnection> (awsiotsdk::ConfigCommon::endpoint_);
...