Dalam cuplikan kode berikut, Color
enum dideklarasikan di dalam Car
kelas untuk membatasi ruang lingkup enum dan berusaha untuk tidak "mencemari" namespace global.
class Car
{
public:
enum Color
{
RED,
BLUE,
WHITE
};
void SetColor( Car::Color color )
{
_color = color;
}
Car::Color GetColor() const
{
return _color;
}
private:
Car::Color _color;
};
(1) Apakah ini cara yang baik untuk membatasi ruang lingkup Color
enum? Atau, haruskah saya mendeklarasikannya di luar Car
kelas, tetapi mungkin di dalam namespace atau struct sendiri? Saya baru saja menemukan artikel ini hari ini, yang mendukung yang terakhir dan membahas beberapa poin bagus tentang enum: http://gamesfromwithin.com/stupid-c-tricks-2-better-enums .
(2) Dalam contoh ini, ketika bekerja di dalam kelas, apakah yang terbaik untuk kode enum sebagai Car::Color
, atau hanya Color
cukup? (Saya menganggap yang pertama lebih baik, kalau-kalau ada Color
enum lain yang dideklarasikan di namespace global. Dengan begitu, setidaknya, kami secara eksplisit tentang enum yang kami rujuk.)
Car::Color getColor()
tetapivoid Car::setColor(Color c)
karena disetColor
kita sudah memiliki specifier.Saat ini - menggunakan C ++ 11 - Anda dapat menggunakan kelas enum untuk ini:
AFAII ini melakukan apa yang Anda inginkan.
sumber
Saya lebih suka pendekatan berikut (kode di bawah). Ini memecahkan masalah "polusi namespace", tetapi juga jauh lebih aman untuk mengetik (Anda tidak dapat menetapkan dan bahkan membandingkan dua enumerasi yang berbeda, atau enumerasi Anda dengan tipe bawaan lainnya, dll.).
Pemakaian:
Saya membuat makro untuk memfasilitasi penggunaan:
Pemakaian:
Beberapa referensi:
sumber
if(c2 == Color::Red )
ini wajar dan harus dikompilasi, tetapi dalam contoh Anda itu tidak. Argumen yang sama untuk penugasan juga!c2
adalah tipe lain (Color2
), jadi mengapa menurut Andac2 == Color::Red
dan tugas harus dikompilasi? Bagaimana jikaColor::Red
1, danColor2::Red
2? HaruskahColor::Red == Color2::Red
mengevaluasi ketrue
ataufalse
? Jika Anda mencampur enumerator yang tidak aman, Anda akan memiliki waktu yang buruk.Secara umum, saya selalu memasukkan enum ke dalam
struct
. Saya telah melihat beberapa pedoman termasuk "awalan".Selalu berpikir ini lebih mirip
C
pedoman daripadaC++
yang (untuk satu karena singkatan dan juga karena ruang nama diC++
).Jadi untuk membatasi ruang lingkup kita sekarang memiliki dua alternatif:
Saya pribadi cenderung menggunakan a
struct
karena ini dapat digunakan sebagai parameter untuk pemrograman template sementara namespace tidak dapat dimanipulasi.Contoh manipulasi meliputi:
yang mengembalikan jumlah elemen enum di dalam struct
T
:)sumber
Jika Anda membuat perpustakaan kode, maka saya akan menggunakan namespace. Namun, Anda masih dapat hanya memiliki satu Warna enum di dalam namespace itu. Jika Anda memerlukan enum yang mungkin menggunakan nama umum, tetapi mungkin memiliki konstanta berbeda untuk kelas yang berbeda, gunakan pendekatan Anda.
sumber