C++

2010-11-15 11 views
13

işlev tanımı ile ilgili bir soru C++ işlev işaretçisi hakkında bazı materyalleri okuyorum ve anlamadığım bir işlev tanımıyla karşılaşıyorum.
Standart fonksiyon tanım formu var:
C++

type name (param...) 

Ama şu tanım bana biraz garip geliyor. Bunu bana açıklayan var mı? Teşekkürler.

float (*GetPtr1(const char opCode)) (float, float)<br> 
{ 
    if(opCode == '+') 
     return &Plus; 
    else 
     return &Minus; // default if invalid operator was passed 
} 


Not: Artı ve Eksi param (şamandıra, şamandıra) ile iki işlevi vardır ve bir şamandıra dönün.

+0

o (== işlemkodu else if '-') 'kontrol etmek iyi olabilir futu bazı gece yarısı yağ yakıcı önlemek için re – Chubsdad

+0

Konu, sorularınız hakkında çok fazla bilgi vermez .. Olmalı. – mih

cevap

10
kıllı bildirimleri okumak için kural bağlamak * önce (yani *a[] işaretçiler bir dizidir () olduğunu ve [] hatırlayarak, en soldaki tanımlayıcı ile başlayıp çıkış yolu çalışmaktır

, (*a)[] bir dizi için bir işaretçi, *f() bir işaretçi dönen bir fonksiyondur, ve (*f)() bir fonksiyonu için işaretçi) aşağıdaki gibidir: opCode '+', GetPtr1 olacak r eşit ise, Yani

 GetPtr1          -- GetPtr1 
     GetPtr1(    )     -- is a function 
     GetPtr1(   opCode)     -- taking a single parameter named opCode 
     GetPtr1(const char opCode)     -- of type const char 
     *GetPtr1(const char opCode)     -- and returning a pointer 
     (*GetPtr1(const char opCode)) (   ) -- to a function 
     (*GetPtr1(const char opCode)) (float, float) -- taking two parameters of type float 
float (*GetPtr1(const char opCode)) (float, float) -- and returning float 

Plus işlevine bir işaretçi seçin ve '-' ise, Minus işlevine bir işaretçi döndürecektir.

C ve C++ bildirimi sözdizimi, ifade merkezlidir (Bjarne aksi taktirde yaptığı gibi); Bildirimin şekli, kodda kullanılacak şekliyle ifadenin biçimi ile eşleşmelidir.biz bir işlev int bir gösterici ile döner f var ve biz işaret ediliyor değeri erişmek istiyorsanız

, biz işlevini yürütmek ve sonuç KQUEUE:

x = *f(); 

ifade tipi Şimdi bir işlevi olduğunu varsayalım *f()int, bu nedenle fonksiyon için beyan/tanım

int *f() { ... } 

olduğunuYukarıda tanımlanan f işlevine bir işaretçi döndürenve f1 numaralı telefonu arayarak bu tamsayı değerine erişmek istiyoruz. Biz (f bir işaretçi döndürür beri) KQUEUE o Sonuç daha sonra (fonksiyon f olan) sonuç derefence, f1 arama ve çalıştırmak ve gerek:

x = *(*f1())(); // *f1() == f, so (*f1())() == f() and *(*f1())() == *f() 

ifade tipi *(*f1())()int, yani f1 ihtiyaçları için decaration/tanım olarak

int *(*f1())() { return f; } 
+0

, Sağ-Sol Kuralı +1 – Chubsdad

+0

+1'in derinlik açıklamalarını, bileşenlerin içerisindeki bir işlev işaretçisini genişletmek için takdir eder. İnsanların ilk defa karşılaşmalarına yardımcı olacak. –

3

const char alır ve float, float alan bir işlev için bir işaretçi döndürür ve bir float döndürür.

+0

... ve float –

+0

@Paul döner: Sağ, teşekkürler. –

16

GetPtr1, bir opcode karakterini alan ve bir işleve bir işaretçi döndüren bir işlevdir. Geri döndüğü işlev iki yüzer alır ve bir kayan döndürür.

seni böyle bir şey yaparsanız okumak daha kolay Bir çok kez: Bir karakter alır ve iki yüzen alır ve bir şamandıra döndüren bir işlev işaretçisi döndüren bir işlev anlamına

typedef float (*FloatOperationFuncPtr) (float, float); 

FloatOperationFuncPtr GetPtr1(const char opCode) 
{ 
    if(opCode == '+') 
     return &Plus; 
    else 
     return &Minus; // default if invalid operator was passed 
} 
+1

+1, Uygun typedefs kullanmak için çok daha kolay, ayrıca \ 'C++ 0x' sürümü, bir şey satırları boyunca ekleyebilirsiniz: typedef std :: function FloatOperationType; bana doğru hizmet ediyor. –

2

.

5

Böyle durumlar için her zaman http://cdecl.org'u bilmek güzel. Sadece parametre isimlerini kaldırırsanız çalışacağını unutmayın. Bu float(*GetPtr1(const char))(float, float) için elde ediyoruz:

dönen (float, float) çalışması için işaretçi dönen fonksiyon (const char) olarak GetPtr1 beyan float

+0

Nifty t o o l. –

1

GetPtr1 bir işlev işaretçisi giriş parametreleri olarak iki şamandıra alır ve döndüren bir fonksiyondur . Bu çok daha net:

typedef float(*Func)(float, float); 


Func GetPtr1(const char opCode) 
{ 
    if(opCode == '+') 
     return &Plus; 
    else 
     return &Minus; // default if invalid operator was passed 
}