Как я могу распечатать shared_ptr
? Мне нужно распечатать sp1
и sp2
через void print()
, но я понятия не имею, как это сделать.
Это код:
struct MediaAsset
{
virtual ~MediaAsset() = default; // make it polymorphic
};
struct Song : public MediaAsset
{
std::string artist;
std::string title;
Song(const std::string& artist_, const std::string& title_) :
artist{ artist_ }, title{ title_ }
{
std::cout << "Song " << artist_ << " - " << title_ << " constructed\n";
}
~Song()
{
std::cout << "~Song " << artist << " - " << title << " destructed\n";
}
void print()
{
//Complete to show information about the current object
}
};
using namespace std;
void example1()
{
auto sp1 = make_shared<Song>("poets","carnival");
shared_ptr<Song> sp2(new Song("poets","late goodbye") );
sp1.print();
sp2.print();
}
Я написал:
void print()
{
std::cout << "artist " << artist << " - " << "title" << title << " end\n";
}
и это сообщение, которое я получаю, когда запускаю программу:
ошибка: «класс std::shared_ptr<Song>» не имеет члена с именем «print»
Точно так же, как если бы вы делали это обычной указкой sp1->print()
. Интеллектуальные указатели разработаны таким образом, чтобы работать максимально близко к обычным указателям.
Сообщение об ошибке верное. print()
не является методом shared_ptr
сам по себе. Вам необходимо разыменовать shared_ptr
, чтобы получить доступ к фактическому объекту Song
, а затем вы сможете получить доступ к его членам по мере необходимости, например:
auto sp1 = make_shared<Song>("poets","carnival");
shared_ptr<Song> sp2(new Song("poets","late goodbye") );
sp1->print();
sp2->print();
Или:
auto sp1 = make_shared<Song>("poets","carnival");
shared_ptr<Song> sp2(new Song("poets","late goodbye") );
(*sp1).print();
(*sp2).print();
Стоит отметить, что на самом деле это не проблема общего_ptr. Если бы у вас был необработанный указатель (или другой умный указатель), вам нужно было бы использовать
->
вместо.
.