Bagikan melalui


Menggunakan dllimport dan dllexport di Kelas C++

Khusus Microsoft

Anda dapat mendeklarasikan kelas C++ dengan dllimport atribut atau dllexport . Bentuk-bentuk ini menyiratkan bahwa seluruh kelas diimpor atau diekspor. Kelas yang diekspor dengan cara ini disebut kelas yang dapat diekspor.

Contoh berikut mendefinisikan kelas yang dapat diekspor. Semua fungsi anggota dan data statisnya diekspor:

#define DllExport   __declspec( dllexport )

class DllExport C {
   int i;
   virtual int func( void ) { return 1; }
};

Perhatikan bahwa penggunaan dllimport eksplisit atribut dan dllexport pada anggota kelas yang dapat diekspor dilarang.

kelas dllexport

Saat Anda mendeklarasikan kelas dllexport, semua fungsi anggotanya dan anggota data statis diekspor. Anda harus memberikan definisi semua anggota tersebut dalam program yang sama. Jika tidak, kesalahan linker dihasilkan. Satu pengecualian untuk aturan ini berlaku untuk fungsi virtual murni, yang anda tidak perlu memberikan definisi eksplisit. Namun, karena destruktor untuk kelas abstrak selalu dipanggil oleh destruktor untuk kelas dasar, destruktor virtual murni harus selalu memberikan definisi. Perhatikan bahwa aturan ini sama untuk kelas yang tidak didukung.

Jika Anda mengekspor data jenis kelas atau fungsi yang mengembalikan kelas, pastikan untuk mengekspor kelas.

kelas dllimport

Saat Anda mendeklarasikan kelas dllimport, semua fungsi anggotanya dan anggota data statis diimpor. Tidak seperti perilaku dan dllimportdllexport pada jenis nonclass, anggota data statis tidak dapat menentukan definisi dalam program yang sama di mana dllimport kelas ditentukan.

Pewarisan dan Kelas yang Dapat Diekspor

Semua kelas dasar kelas yang dapat diekspor harus dapat diekspor. Jika tidak, peringatan kompilator dihasilkan. Selain itu, semua anggota yang dapat diakses yang juga merupakan kelas harus dapat diekspor. Aturan ini mengizinkan dllexport kelas untuk mewarisi dari dllimport kelas, dan dllimport kelas untuk mewarisi dari dllexport kelas (meskipun yang terakhir tidak disarankan). Sebagai aturan, semua yang dapat diakses oleh klien DLL (menurut aturan akses C++) harus menjadi bagian dari antarmuka yang dapat diekspor. Ini termasuk anggota data privat yang dirujuk dalam fungsi sebaris.

Impor/Ekspor Anggota Selektif

Karena fungsi anggota dan data statis dalam kelas secara implisit memiliki tautan eksternal, Anda dapat mendeklarasikannya dengan dllimport atribut atau dllexport , kecuali seluruh kelas diekspor. Jika seluruh kelas diimpor atau diekspor, deklarasi eksplisit fungsi dan data anggota sebagai dllimport atau dllexport dilarang. Jika Anda mendeklarasikan anggota data statis dalam definisi kelas sebagai dllexport, definisi harus terjadi di suatu tempat dalam program yang sama (seperti dengan tautan eksternal nonclass).

Demikian pula, Anda dapat mendeklarasikan fungsi anggota dengan dllimport atribut atau dllexport . Dalam hal ini, Anda harus memberikan dllexport definisi di suatu tempat dalam program yang sama.

Ada baiknya untuk mencatat beberapa poin penting mengenai impor dan ekspor anggota selektif:

  • Impor/ekspor anggota selektif paling baik digunakan untuk menyediakan versi antarmuka kelas yang diekspor yang lebih ketat; yaitu, satu di mana Anda dapat merancang DLL yang mengekspos lebih sedikit fitur publik dan privat daripada bahasa yang diizinkan. Ini juga berguna untuk menyempurnakan antarmuka yang dapat diekspor: ketika Anda tahu bahwa klien, menurut definisi, tidak dapat mengakses beberapa data privat, Anda tidak perlu mengekspor seluruh kelas.

  • Jika Anda mengekspor satu fungsi virtual di kelas, Anda harus mengekspor semuanya, atau setidaknya menyediakan versi yang dapat digunakan klien secara langsung.

  • Jika Anda memiliki kelas di mana Anda menggunakan impor/ekspor anggota selektif dengan fungsi virtual, fungsi harus berada di antarmuka yang dapat diekspor atau ditentukan sebaris (terlihat oleh klien).

  • Jika Anda menentukan anggota sebagai dllexport tetapi tidak menyertakannya dalam definisi kelas, kesalahan kompilator dihasilkan. Anda harus menentukan anggota di header kelas.

  • Meskipun definisi anggota kelas sebagai dllimport atau dllexport diizinkan, Anda tidak dapat mengambil alih antarmuka yang ditentukan dalam definisi kelas.

  • Jika Anda menentukan fungsi anggota di tempat selain isi definisi kelas tempat Anda mendeklarasikannya, peringatan dihasilkan jika fungsi didefinisikan sebagai dllexport atau dllimport (jika definisi ini berbeda dari yang ditentukan dalam deklarasi kelas).

END Khusus Microsoft

Baca juga

dllexport, dllimport