2010-05-24 31 views
8

Với một lớp dụ:Sử dụng một con trỏ hàm thành viên trong một lớp

class Fred 
{ 
public: 
Fred() 
{ 
    func = &Fred::fa; 
} 

void run() 
{ 
    int foo, bar; 
    *func(foo,bar); 
} 

double fa(int x, int y); 
double fb(int x, int y); 

private: 
double (Fred::*func)(int x, int y); 
}; 

tôi nhận được một lỗi biên dịch tại dòng gọi hàm thành viên thông qua con trỏ "* func (foo, bar)", nói rằng: "thuật ngữ không đánh giá một hàm lấy 2 đối số". Tôi đang làm gì sai?

+0

cảm ơn bạn đã chỉnh sửa :) –

+0

... không vấn đề gì;) – neuviemeporte

Trả lời

18

Cú pháp bạn cần trông giống như:

((object).*(ptrToMember)) 

Vì vậy, cuộc gọi của bạn sẽ là:

((*this).*(func))(foo, bar); 

Tôi tin rằng một cú pháp thay thế sẽ là:

(this->*func)(foo, bar); 
6

Bạn cần những điều sau đây cú pháp sôi nổi để gọi hàm thành viên thông qua con trỏ:

(this->*func)(foo, bar); 
4

Có hai điều bạn cần phải quan tâm. Đầu tiên là tuyên bố của các loại con trỏ hàm:

private: 
    typedef double (Fred::*fptr)(int x, int y); 
    fptr func; 

Tiếp theo là cú pháp để gọi chức năng sử dụng một con trỏ:

(this->*func)(foo,bar) 

Dưới đây là đoạn code mẫu sửa đổi đó sẽ biên dịch và chạy:

#include <iostream> 

class Fred 
{ 
public: 
    Fred() 
    { 
    func = &Fred::fa; 
    } 

    void run() 
    { 
    int foo = 10, bar = 20; 
    std::cout << (this->*func)(foo,bar) << '\n'; 
    } 

    double fa(int x, int y) 
    { 
    return (double)(x + y); 
    } 
    double fb(int x, int y) 
    { 
    } 

private: 
    typedef double (Fred::*fptr)(int x, int y); 
    fptr func; 
}; 

int 
main() 
{ 
    Fred f; 
    f.run(); 
    return 0; 
} 
0

Chức năng thành viên lớp không tĩnh đã ẩn con trỏ này làm đối số.

Tôi nghĩ, cú pháp (điều này -> * func) (foo, bar) là cách để làm cho trình biên dịch hiểu rằng cần thêm hàm này vào hàm.

1

Hàm thành viên có hai arg thực sự là hàm ba arg. 'this' là một đối số ngầm định vì vậy lỗi bạn đang nhận được là thiếu 'this' arg.

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