2011-11-08 79 views
14

Tôi nhận được lỗi 'biểu thức trường hợp không cố định' trong câu lệnh chuyển đổi. Tuy nhiên, tiêu đề cung cấp một định nghĩa cho các hằng số được sử dụng, và hàm tạo cung cấp khởi tạo cho chúng trong danh sách khởi tạo của nó.Biểu thức ca không liên tục

Ngoài ra, khi tôi di chuột qua câu lệnh "sự cố", nó sẽ nhận dạng chúng dưới dạng hằng số.

const int ThisClass::EXAMPLE_CONSTANT 

error expression must have a constant value 

Điều này có vẻ hơi phản trực giác đối với tôi. Tôi đã làm một số nghiên cứu và tìm thấy một vấn đề tương tự mà người khác đã có. Họ được cho biết rằng tất cả các hằng số phải được khởi tạo trong 'chính' và rằng đây là một hạn chế của ngôn ngữ. Đây đúng là tình trạng đó phải không? Có vẻ như không.

+1

cung cấp mã thực tế thể hiện sự cố. Những gì bạn dán không thực sự hữu ích. – tenfour

+0

vui lòng đăng mã – Heisenbug

+0

Trình biên dịch nào bạn đang sử dụng? Nó thực sự là C++? – harper

Trả lời

12

Các case báo cáo đòi hỏi giá trị không thể thiếu đó phải được biết lúc biên dịch - thời gian, nghĩa là hằng số ở đây. Nhưng các thành viên const của một lớp học không thực sự là hằng số theo nghĩa đó. Chúng chỉ đơn giản là chỉ đọc.

Thay vì lĩnh vực, bạn có thể sử dụng enum:

class ThisClass 
{ 
    public: 

     enum Constants 
     { 
      EXAMPLE_CONSTANT = 10, 
      ANOTHER_CONSTANT = 20 
     };  
}; 

Và sau đó bạn có thể viết,

switch(c) 
{ 
     case ThisClass::EXAMPLE_CONSTANT: 
        //code 
        break; 
     case ThisClass::ANOTHER_CONSTANT: 
        //code 
        break; 
}; 
+2

nếu các hằng số không liên quan, tôi đề nghị sử dụng một enumed enum. –

3

Bạn cần hằng số nguyên thời gian biên dịch "thực". const trong C++ có nghĩa là chỉ đọc và biến const có thể được khởi tạo giống như int y = 0; const int x = y;, làm cho x bản sao chỉ đọc của giá trị y có tại thời điểm khởi tạo.

Với một trình biên dịch hiện đại, bạn có thể sử dụng enum s hoặc constexpr s để lưu trữ các thành viên (không thể thiếu) của thời gian biên dịch-constness:

class Foo { 
public: 
    static constexpr int x = 0; 
    enum { y = 1 }; 
}; 

int main() { 
    switch (0) { 
    case Foo::x: ; 
    case Foo::y: ; 
    } 
} 
+0

'constexpr' không làm cho thành viên tĩnh. –

+0

@Martinho: Đã sửa lỗi. –

1

Constants dùng trong trường hợp nhãn phải không thể thiếu biểu thức hằng số. Biểu thức liên tục không thể tách rời phải đáp ứng một bộ yêu cầu nghiêm ngặt hơn nhiều so với chỉ là một đối tượng tách rời được khai báo là const.

Không thể sử dụng thành viên lớp không tĩnh trong biểu thức hằng số tích phân, vì vậy những gì bạn đang cố gắng thực hiện sẽ không biên dịch. Một thành viên lớp tĩnh, ví dụ, có thể được sử dụng trong một biểu thức hằng số tích phân nếu khởi tạo của nó là "có thể nhìn thấy" tại thời điểm sử dụng.

1

Đây là một chút lộn xộn. Trong C++ const có thể được sử dụng cho một số thứ, như khai báo các hằng số thực tế và khai báo các biến chỉ đọc.

Nếu bạn khai báo:

const int x = 0; 

Trong toàn cầu, không gian tên, hoặc phạm vi địa phương, nó là một hằng số. Bạn có thể sử dụng nó ở nơi biểu thức liên tục được yêu cầu (như nhãn trường hợp hoặc kích thước mảng). Tuy nhiên, ở phạm vi lớp hoặc như một tham số hàm, nó chỉ là một biến chỉ đọc.

Ngoài ra, nếu bạn khai báo ở phạm vi lớp:

static const int x = 0; 

Đây cũng là một hằng số.

+1

Biến 'const int' được khai báo trong phạm vi chức năng (tức là trong phạm vi địa phương) và được khởi tạo với một biểu thức hằng số không thể tự tạo thành các biểu thức hằng số trong C++. Vì vậy, trong phạm vi chức năng nó không chỉ là một "biến chỉ đọc". – AnT

+0

@AndreyT oops, tôi có nghĩa là tham số chức năng :) Cảm ơn. –

0

std::map + C++ 11 lambdas workaround

Phương pháp này cho phép hằng thuốc, nên cung cấp cho chúng tôi O(1) khấu hao What is the best way to use a HashMap in C++?:

#include <ctime> 
#include <functional> 
#include <unordered_map> 
#include <iostream> 

int main() { 
    int result; 
    int key0 = std::time(NULL) % 3; 
    int key1 = (key0 + 1) % 3; 
    int key2 = (key0 + 2) % 3; 
    std::unordered_map<int,std::function<void()>> m{ 
     {key0, [&](){ result = 0; }}, 
     {key1, [&](){ result = 1; }}, 
     {key2, [&](){ result = 2; }}, 
    }; 
    m[key0](); 
    std::cout << key0 << " " << result << std::endl; 
    m[key1](); 
    std::cout << key1 << " " << result << std::endl; 
    m[key2](); 
    std::cout << key2 << " " << result << std::endl; 
} 

thể đầu ra:

1 0 
2 1 
0 2 

Đối sử dụng từ bên trong một lớp, đừng quên xây dựng bản đồ stati cally như được hiển thị tại: Why switch statement cannot be applied on strings?

Các vấn đề liên quan