Secara default, gunakan fungsi namespaced.
Kelas adalah untuk membangun objek, bukan untuk mengganti ruang nama.
Dalam kode Berorientasi Objek
Scott Meyers menulis seluruh Item untuk buku C ++ Efektifnya tentang topik ini, "Lebih suka fungsi bukan teman yang bukan anggota daripada fungsi anggota". Saya menemukan referensi online untuk prinsip ini dalam sebuah artikel dari Herb Sutter:http://www.gotw.ca/gotw/084.htm
Yang penting untuk diketahui adalah bahwa: Dalam fungsi C ++ di namespace yang sama dengan kelas milik antarmuka kelas itu (karena ADL akan mencari fungsi-fungsi itu ketika menyelesaikan panggilan fungsi).
Fungsi dengan nama tempat, kecuali dinyatakan sebagai "teman," tidak memiliki akses ke internal kelas, sedangkan metode statis memiliki.
Ini berarti, misalnya, bahwa ketika mempertahankan kelas Anda, jika Anda perlu mengubah internal kelas Anda, Anda perlu mencari efek samping dalam semua metodenya, termasuk yang statis.
Ekstensi I
Menambahkan kode ke antarmuka kelas.
Di C #, Anda bisa menambahkan metode ke kelas bahkan jika Anda tidak memiliki akses ke sana. Tetapi dalam C ++, ini tidak mungkin.
Tapi, masih di C ++, Anda masih bisa menambahkan fungsi namespaced, bahkan ke kelas yang dituliskan untuk Anda.
Lihat dari sisi lain, ini penting ketika mendesain kode Anda, karena dengan meletakkan fungsi Anda di namespace, Anda akan mengotorisasi pengguna Anda untuk menambah / melengkapi antarmuka kelas.
Ekstensi II
Efek samping dari poin sebelumnya, tidak mungkin untuk mendeklarasikan metode statis dalam banyak header. Setiap metode harus dideklarasikan di kelas yang sama.
Untuk ruang nama, fungsi dari namespace yang sama dapat dideklarasikan dalam banyak header (fungsi swap yang hampir standar adalah contoh terbaik dari itu).
Perpanjangan III
Kesejukan dasar namespace adalah bahwa dalam beberapa kode, Anda dapat menghindari menyebutkannya, jika Anda menggunakan kata kunci "menggunakan":
#include <string>
#include <vector>
// Etc.
{
using namespace std ;
// Now, everything from std is accessible without qualification
string s ; // Ok
vector v ; // Ok
}
string ss ; // COMPILATION ERROR
vector vv ; // COMPILATION ERROR
Dan Anda bahkan dapat membatasi "polusi" ke satu kelas:
#include <string>
#include <vector>
{
using std::string ;
string s ; // Ok
vector v ; // COMPILATION ERROR
}
string ss ; // COMPILATION ERROR
vector vv ; // COMPILATION ERROR
"Pola" ini wajib untuk penggunaan yang tepat dari idiom swap yang hampir standar.
Dan ini tidak mungkin dilakukan dengan metode statis di kelas.
Jadi, namespace C ++ memiliki semantik sendiri.
Tapi itu lebih jauh, karena Anda dapat menggabungkan ruang nama dengan cara yang mirip dengan warisan.
Misalnya, jika Anda memiliki namespace A dengan fungsi AAA, namespace B dengan fungsi BBB, Anda dapat mendeklarasikan namespace C, dan membawa AAA dan BBB di namespace ini dengan menggunakan kata kunci.
Kesimpulan
Ruang nama adalah untuk ruang nama. Kelas adalah untuk kelas.
C ++ dirancang sehingga setiap konsep berbeda, dan digunakan secara berbeda, dalam kasus yang berbeda, sebagai solusi untuk masalah yang berbeda.
Jangan gunakan kelas saat Anda membutuhkan ruang nama.
Dan dalam kasus Anda, Anda perlu ruang nama.