Smart Pointer biasanya dapat digunakan di semua tempat pointer mentah digunakan (atau begitulah yang saya katakan). Katakanlah saya mengalokasikan array 256 karakter dan membaca dalam satu baris teks menggunakan std::cin.getline()

char* text { new char[256] };
auto smart_text { std::make_unique<char[]>(256) };

std::cin.getline(text, 256); // legal
std::cin.getline(smart_text, 256); // illegal

Pertanyaan saya pada dasarnya adalah mengapa saya tidak dapat menggunakan smart_text dengan cara yang sama seperti saya menggunakan text. Keduanya adalah pointer ke array karakter tetapi mereka hanya dikelola secara berbeda.

Dugaan saya adalah bahwa smart pointer adalah abstraksi dari STL dan std::getline adalah kode lama yang hanya menerima argumen pointer mentah. Dalam hal ini, apakah yang berikut ini akan menjadi "cara yang benar" untuk mendekati masalah?

std::cin.getline(smart_text.get(), 256);

Dalam hal ini kita hanya meneruskan alamat memori pointer di bawah abstraksi?

0
Mutating Algorithm 21 September 2019, 04:23

1 menjawab

Jawaban Terbaik

Pertanyaan saya pada dasarnya adalah mengapa saya tidak dapat menggunakan smart_text dengan cara yang sama seperti saya menggunakan text.

Karena pointer pintar tidak memiliki konversi implisit menjadi pointer mentah. Untuk meneruskan penunjuk cerdas tempat penunjuk mentah digunakan, Anda memerlukan konversi eksplisit untuk mengakses penunjuk mentah yang dipegang penunjuk pintar.

Dugaan saya adalah bahwa smart pointer adalah abstraksi dari STL dan std::getline adalah kode lama yang hanya menerima argumen pointer mentah.

1

1. STL sekarang dikenal sebagai "perpustakaan standar", dan maksud Anda std::istream::getline() alih-alih std::getline(), keduanya tidak merupakan warisan.

Dalam hal ini, apakah yang berikut ini akan menjadi "cara yang benar" untuk mendekati masalah?

std::cin.getline(smart_text.get(), 256);

Iya.

Dalam hal ini kita hanya meneruskan alamat memori pointer di bawah abstraksi?

Iya.

1
Remy Lebeau 21 September 2019, 02:06