首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 列舉類型作為函式參數:正確傳遞與型別轉換

     編輯:程式設計疑難解答

問題重現


class Date {
public:
    enum Month { jan=1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec };
    Date(int d, Month m, int y);
};

int main() {
    My_Code::Date b(2, jan, 1992); // 編譯錯誤:jan 未宣告
}

錯誤原因

enum Month 定義在 Date 類別內,屬於 巢狀型別。外部呼叫必須加上完整限定名稱:Date::Month 或 My_Code::Date::Month。

正確寫法


// 方式 1:完整限定名稱
My_Code::Date b(2, My_Code::Date::jan, 1992);

// 方式 2:使用 using 宣告(僅限 .cpp)
using My_Code::Date::Month;
Date b(2, Month::jan, 1992); // C++11 強型別 enum class 需加 Month::

// 方式 3:若 enum 為無限定名稱(unscoped enum),可隱性轉換為 int
Date b(2, static_cast(1), 1992); // 不建議,失去型別安全

現代 C++ 建議:改用 enum class


class Date {
public:
    enum class Month : int { Jan=1, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec };
    Date(int d, Month m, int y);
};

// 呼叫端
Date d(2, Date::Month::Jan, 1992); // 型別安全,不會隱性轉 int

優點:
✅ 避免命名空間汙染
✅ 強型別,禁止隱性轉換為整數
✅ 可指定底層型別(: int)

常見誤區

  • ❌ 直接寫 jan → 編譯器找不到符號
  • ❌ 強制轉 (Month)9 → 魔術數字、難維護
  • ✅ 使用完整限定名或 using 宣告
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved