2012-09-06 28 views
5

Ben bunu nasıl işleyeceğini anlayamıyorum üyeleri işlevini yapmak için işaretçilerle bir şeyler yapmaya çalışıyorum.işlevine işaretçi üye

ben A'ya bir işaretçi ilan edip sonra A. üyelerinden birine başka bir işlev için bir işlev işaretçisi geçmek istiyorum bu

class A 
{ 
    public: 
    float Plus (float a, float b) { return a+b; } 
    float Minus (float a, float b) { return a-b; } 
    float Multiply(float a, float b) { return a*b; } 
    float Divide (float a, float b) { return a/b; } 
}; 

gibi görünür bir A sınıfı var

void Will_Get_Function_Pointer(float a, float b, float (A::*pt2Func)(float, float)) 
{ 
    (...) 
} 

nereden bu

01 gibi bir şeyle çağırır: bir şey bunu beğendiBunu yapmak bu

vector<A> vecA; 
myA = &vecA[xxx] 

gibi görünecek şey bir nesneler topluluğu belirli A'ya işaret eder çünkü benim son uygulama A'da statik/const üye kullanamazsınız

sefil

başarısız
typedef float (A::*pA)(float x, float y); 
pA p = &myA->Minus; 

ve derleyici, & A :: Eksi kullanmamı söylüyor ancak bu benim için çalışmaz.

Bunu yapabilir miyim?

Şerefe

Yapamazsın

cevap

6
A* myA = new A; 
Will_Get_Function_Pointer(1.00,2.00, &myA->Minus) 

. Sen

void Will_Get_Function_Pointer(A* object, float a, float b, 
float (A::*pt2Func)(float, float)) 
{ 
    (object->*pt2Func)(a, b); 
} 

gibi bir şey kullanmak Ve

A* myA = new A; 
Will_Get_Function_Pointer(myA, 1.00, 2.00, &A::Minus); 

Basit örnek olarak çağırır olmalıdır.

http://liveworkspace.org/code/79939893695e40f1761d81ba834c5d15

+0

@ForEverT teşekkürler! harika çalıştı!Bağlama için –

2

Maalesef dili bir çağrılabilir nesnesi yapmak için üye işlevine bir nesne bağlamak için sözdizimi kullanır izin vermez. Bir nesne referansı (veya işaretçisi) geçmek ve Aradığınızda işlevini bağlamak ya:

void Will_Get_Function_Pointer(float a, float b, A & obj, float (A::*pt2Func)(float, float)) 
{ 
    (obj.pt2Func)(a,b); 
} 

Will_Get_Function_Pointer(1.00, 2.00, myA, &A::Minus); 

Yoksa nesneye işlev işaretçisi bağlayan bir işlev nesnesi oluşturabilirsiniz:

void Will_Get_Function(float a, float b, std::function<float(float,float)> f) 
{ 
    f(a,b); 
} 

Will_Get_Function(1.00, 2.00, std::bind(&A::Minus, &myA)); 

Not: function ve bind, C++ 11'de yeni; Boost, dilin eski bir sürümü ile sıkışmışsanız, eşdeğer sağlar. sizin üye işlevinin çağrılması

+0

+1 - bu, işlevlere yapılan başvurularla uğraşırken genellikle işe gitme işlevidir. – Marcin

+0

, C++ 11 veya boost kullanamaz. Ama bu bağlama sözdizimi gerçekten çok güzel. –

2

Use a macro.

#define CALL_MEMBER_FN(object,ptrToMember) ((object).*(ptrToMember)) 

basittir size aramak istediğiniz işlevi için already have a typedef çünkü.

float result = CALL_MEMBER_FN(*myA, pA)(a, b); 
+0

SSS işlevinin üye işlevlerine bildirilmesiyle ilgili paralel tavsiyesini kaçırmayın: [typedef kullanın] (http://www.parashift.com/c++-faq-lite/typedef-for-ptr-to-memfn. html). –

+0

"CALL_MEMBER_FN (* myA, pA) (x, y);" olması gerektiğini varsayalım, çünkü onun adına rağmen, makronuzun hiçbir şeyi yoktur. Şahsen, ben (myA-> pA) (x, y) 'yi bu karmaşadan daha kolay okunabilir buluyordum. –

+0

Hayır, elbette haklısınız. Sabit. –

İlgili konular