2010-02-04 69 views
13

Thứ nhất, tôi có các chức năng như thế này.Làm thế nào để bạn khai báo một mảng const của con trỏ hàm?

void func1(); 
void func2(); 
void func3(); 

Sau đó, tôi tạo typedef của tôi cho các mảng:

void (*FP)(); 

Nếu tôi viết một mảng bình thường của con trỏ hàm, nó phải là một cái gì đó như thế này:

FP array[3] = {&func1, &func2, &func3}; 

Tôi muốn tạo một mảng không đổi, sử dụng const trước "FP", nhưng tôi đã nhận được thông báo lỗi này:

error: cannot convert 'void (*)()' to 'void (* const)()' inialization

PD: Xin lỗi vì tiếng Anh không tốt của tôi.

EDIT:

x.h

typedef void (*FP)(); 

class x 
{ 
private: 
    int number; 
    void func1(); 
    void func2(); 
    void func3(); 
    static const FP array[3]; 
} 

x.cpp

const FP x::array[3] = {&x::func1, &x::func2, &x::func3}; 

Mã của tôi là lớn và phức tạp hơn, đây là một bản tóm tắt

+1

của nó luôn luôn tốt hơn để viết mã thực tế hơn là nói "Sau đó, tôi tạo typedef của tôi cho các mảng:" hoặc "sử dụng const trước khi 'FP'". – sand

+0

@Facon: Bạn đang sử dụng một lớp học? Bạn có thể đăng toàn bộ mã ở đây không? – Jagannath

+0

Tôi đã chỉnh sửa bài đăng. – Facon

Trả lời

8

Then I create my typedef for the array: void (*FP)();

Bạn đã bỏ lỡ typedef trước void?

Làm việc sau trên trình biên dịch của tôi.

void func1(){} 
void func2(){} 
void func3(){} 

typedef void (*FP)(); 


int main() 
{ 
    const FP ar[3]= {&func1, &func2, &func3}; 
} 

EDIT

(sau khi nhìn thấy nội dung chỉnh sửa)

x.h

class x; 
typedef void (x::*FP)(); // you made a mistake here 

class x 
{ 
    public: 
     void func1(); 
     void func2(); 
     void func3(); 
     static const FP array[3]; 
}; 
+0

Tôi đã sử dụng một lớp ..., nó sẽ đưa tôi cùng một lỗi bằng cách sử dụng mảng const FP [3] = ... hoặc sử dụng mảng FP const [3] = ... – Facon

+0

Hiển thị toàn bộ mã * thực tế * của bạn. –

+0

Tôi đã chỉnh sửa bài đăng. – Facon

2
typedef void (*FPTR)(); 

FPTR const fa[] = { f1, f2}; 
// fa[1] = f2; You get compilation error when uncomment this line. 
1

Nếu bạn muốn các mảng mình là const:

FP const a[] = 
    { 
     func1, 
     func2, 
     func3 
    }; 
+0

Cho dù ông viết 'FP const' hoặc' const FP' không có sự khác biệt. Xem câu hỏi này: http://stackoverflow.com/questions/1808471/is-const-lpvoid-equivalent-to-void-const –

+0

@ltib: Trong khi tôi đồng ý, tôi không chắc chắn tôi thấy sự liên quan của bình luận của bạn. Có lẽ bạn chỉ đang quan sát, trong trường hợp đó, cổ vũ. –

+0

Tôi chỉ là một chút bối rối, vì câu trả lời của bạn và câu hỏi về cơ bản giống hệt nhau. Chỉ cần của bạn là một mảng không phải là thành viên (và bạn có const ở một nơi khác). Vì vậy, tôi không thấy sự liên quan của câu trả lời của bạn. Nhưng có lẽ bạn chỉ quan sát tương tự như vậy, vì vậy cổ vũ. –

3

Trình biên dịch bạn đang sử dụng? Điều này hoạt động trên VS2005.

#include <iostream> 

void func1() {std::cout << "func1" << std::endl;} 
void func2() {std::cout << "func2" << std::endl;} 
void func3() {std::cout << "func3" << std::endl;} 

int main() 
{ 
int ret = 0; 

typedef void (*FP)(); 

const FP array[3] = {&func1, &func2, &func3}; 

return ret; 
} 
+0

g ++ của Trình biên dịch GNU – Facon

4

mà không typedef:

void (*const fp[])() = { 
    f1, 
    f2, 
    f3, 
}; 
Các vấn đề liên quan