2016-10-30 20 views
7

Başlık hakkında emin değilim çünkü bunun gerçekten ne olduğunu bilmiyorum.C++ struct ve typdef

Aşağıdaki bağlantıdaki kodu anlamaya çalışıyordum.

Color Based Particle Filter

Genellikle programın ne yaptığını anlıyorum ama "state.h" çözemedim. Bu kod ne yapar? Özellikle "typedef", "State_" ve "pp" parçaları bana yabancı görünüyor.

Açıklık nedenlerinden dolayı bazı kodları buraya koyacağım.

struct StateData; 
struct State_; 
typedef State_ (*State)(StateData&); 
struct State_ 
{ 
    State_(State pp) : p(pp) { } 
    operator State() 
    { 
     return p; 
    } 
    State p; 
}; 

State_ state_start(StateData& d); 
State_ state_selecting(StateData& d); 
State_ state_initializing(StateData& d); 
State_ state_tracking(StateData& d); 

Her türlü yardım çok takdir edilecektir.

cevap

5

referans kabul etmesi State_ döndürür. State_, State üyesine sahip ve örtülü olarak State'a dönüştürülebilen bir sarmalayıcı sınıftır.

State_ sarıcısına neden ihtiyaç duyulmasının nedeni, aynı türde bir işlev için bir işaretçi döndüren bir işlevi ifade etmenin bir yolu olmadığından ötürüdür. Sargı, öz referanstan kurtulur. çizgi ile


Hattı:

struct StateData; 

bir sınıf StateData bir ileri beyanı.

struct State_; 

bir sınıf State_ bir ileriye doğru bildirimi.

typedef State_ (*State)(StateData&); 

Bu biraz zor. Bir State_ döndüren ve bir argüman olarak bir StateData& alır bir işlev işaretçisi için bir işlev işaretçisi için bir tür diğer adı olarak State tanımlar. Snippet'in sonunda bildirilen işlevler, bu tür bir işlev işaretçisi tarafından işaret edilebilir.

Benim düşünceme göre, seçilen ad zaten State_ sınıfı olduğunu göz önünde bulundurarak çok kafa karıştırıcı. Ben Macar notasyonu karşı genelde olduğum sürece, ben her zaman bir işlev işaretçisi belirtmek için bir sonek veya önek uygulamak öneriyoruz, state_fun veya state_handler veya state_callback,

struct State_ 
{ 

Bu State_ calss tanımını başladığını düşünelim.

State_(State pp) : p(pp) { } 

Bu, sınıf için bir kurucu tanımlar. Argüman, daha önce tanımlanan işlev işaretçi tipindedir. Kısa süre içinde ilan edilecek üyeyi başlatır.

operator State() 
    { 
     return p; 
    } 

Bir üye işlevi. Daha spesifik olarak, bir kullanıcı tanımlı işaretçi türüne dönüştürebilir.

State p; 

yapıcıda başlatıldı elemanı bildirir. Bir State tarafından işaret edilebilir

}; 

State_ state_start(StateData& d); 
State_ state_selecting(StateData& d); 
State_ state_initializing(StateData& d); 
State_ state_tracking(StateData& d); 

Ücretsiz işlevleri. İşaretçi işlevini tanımlarken, typedef yardımcı olur.

+0

Cevabınız için teşekkür ederim, ancak "operatör" işlevini anlamıyorum. Daha fazlasını açıklayabilir misin? @ user2079303 –

+0

@ AnitaW.Smith ne anlama geliyor? Kullanıcı tanımlı dönüşümleri incelediniz mi? – user2079303

+0

Daha önce hiç duymadım. Onu arayacağım. Bu dava için açıklanması kolaysa, bana ne yaptığını kısaca söyleyebilir misiniz? @ user2079303 –

3

State_, bir yapı türüdür.

State işlevi, StateData& türünde bir parametre kabul etmek ve State_ döndürerek dönen bir işaretçidir.

typedef a b;, ile aynı olan b türünü tanımlar.

p sınıf State_ sınıfında bir alan, pp yapıcının bir parametresidir. p(pp)pp

1

Bu seferki değerine p başlatılıyor, kullanım türü
Örnek için yeni bir takma adı oluşturun isim StateData

struct StateData; 

typedef anahtar kelime içeren bir yapı sadece yapıcı için özel bir sözdizimi beyan olduğunu : Bunun

typedef int mynumber; /// mynumber is an alias of type of int 
mynumber number = 3; /// so you can do this (number is a type of int just the int name is different) 

bir avantajı m masif örneği varsa kolayca özel sayı değişkenin veri türünü değiştirebilir olduğu ynumber:
Örnek:

typedef int mynumber; 
mynumber number1 = 3; 
mynumber number2 = 4; 
mynumber number3 = 5; 
// what if you want to make all this type of double? or a float? easy 
// just change the int to a double or float like this 
    typedef float mynumber; 
    typedef double mynumber; 

Bu bir isim State_

struct State_; 

Bu, bir Yukarıda belirtilen edildi State_ tanımlayan bir yapı bildirir.

struct State_ 
{ 
    State_(State pp) : p(pp) { } 
    operator State() 
    { 
     return p; 
    } 
    State p; 
}; 

Bu, p'u başlatan listedir. struct içinde olarak beyan edilen p'u başlatır (i, e. State p); State işlev işaretçisi için bir takma ad:

State_(State pp) : p(pp) 
{ 
} 

Bu prototip fonksiyonları StateData

Kısaca
State_ state_start(StateData& d); 
State_ state_selecting(StateData& d); 
State_ state_initializing(StateData& d); 
State_ state_tracking(StateData& d); 
1

Aşağıdaki başlık ile bir işleviniz var. State_ dönüş tipi ve giriş StateData'ya bir başvurudır.

State_ function (StateData&) 

Ardından bu işlevin bir işaretçisini tanımlamak için yalnızca yıldız (ve önceliği çözmek için parens) ekleyin.

State_ (*State) (StateData&) 

Sonra yeni bir türü olarak tanımlamak için bu önüne Typedef koydu. Şimdi başka yerlerde kullanılabilecek yeni bir tipiniz var. typedef, kodunuzu daha okunabilir kılan tür takma adları oluşturmak için kullanılır.

typedef State_ (*State) (StateData&) 

Artık bu tür durum başka yerlerde kullanılabilir.

State_(State pp) 

diğer almak yazma işlevlerini yapmak typedef kullanarak işaretçi işleve tiplerini belirlemek için güçlü olmak kurucusuna bu yeni tip girdi olarak

State p 

kullanın yeni Devlet türünü kullanarak yeni değişken p beyan giriş olarak okunabilir çok işlevli.

+0

C++ sorusu, C kitaplarını okumak, yeni başlayanlar için hiç kimseyi iyi yapmaz – deW1

+0

Sorudan kitaba referansı kaldırdım. –

İlgili konular