Soru:
Temel C ++ programlama, yapıcı bağımsız değişkeni sınıfa nasıl geçirilir?
vxcheese
2015-12-25 02:34:06 UTC
view on stackexchange narkive permalink

Bazı programlama sorunları yaşıyorum.

İşte olan şey:

.ino dosyamda, tutan bir tft değişkeni var LCD'ye bağlantı. .İno içinde bulunan tft sınıfına otomatik olarak erişebilen veya oluşturulduğunda kurucuya aktarabilen bir sınıf yapmak istiyorum; temelde:

  // bunun .ino olduğunu varsayarsak: TFT_ILI9163C tft = TFT_ILI9163C (cs, dc, rst); MenuClass * menu = MenuClass (); menu->init ("Örnek", tft); // bu çalışmalı ve "menu" artık "tft" değişkenine erişebilmelidir  

İşte benim Menu.cpp:

  // Menü sınıfı #include "Menu.h" #include <SPI.h> # include <Adafruit_GFX.h> # include <TFT_ILI9163C.h>String menName :: StringName :: StringName (StringName :: dizge adı); void MenuClassed adı ) {menName;} void MenuClass :: draw () {tft.setCursor (2, 2); tft.print (menName);} MenuClass Menüsü;  
Hangi argümanın "tft" olarak aktarılması gerekiyor?
Bir cevap:
MarkU
2015-12-25 05:17:31 UTC
view on stackexchange narkive permalink

MenuClass'ın her örneğinin bir TFT_ILI9163C görüntüleme nesnesiyle ilişkilendirilmesini istediğinizi varsayarsak, şuna benzer bir şey kullanabilirsiniz:

  // MenuClass.hclass TFT_ILI9163C; // TFT_ILI9163C.hclass MenuClass'ta tanımlanan bir sınıf adı bildirin {private: // yapıcı tarafından başlatılan salt okunur özel üye // (m_ öneki genellikle sınıf üye değerlerini belirtmek için kullanılır) TFT_ILI9163C * m_tft; public: // yapıcı MenuClass (TFT_ILI9163C * pTft): m_tft (pTft) {}; private: // Name özelliği için özel depolama String m_Name; public: // Name özelliğini okuyun String getName () {return m_Name; }; public: // Name özelliğini yazın void setName (String değeri) {m_Name = value; }; public: void draw () {// m_tft üyesi, m_tft->setCursor (2, 2) görüntüleme sınıfına bir referanstır; m_tft->print (m_Name); };} MenuClass Menu;  

Yalnızca bir kurucu olduğunu ve TFT_ILI9163C ekranına bir işaretçi gerektirdiğini unutmayın. Yapıcının gövdesi : m_tft (pTft) {}; , m_tft özel üyesini pTft yapıcı bağımsız değişkeni ile başlatır, böylece MenuClass üye işlevleri çağırır TFT, m_tft->fn (args); "void constructor" MenuClass (void) olmadığından, m_tft etkin bir şekilde işaret etme garantilidir geçerli bir TFT_ILI9163C örneğine.

menName türünde bir sınıf özelliği kullanıyormuşsunuz gibi göründüğünden, bunu daha yaygın kullanılan m_propertyname stilinde yeniden yazdım. MenuClass :: init () öğeniz bir ad özelliği belirleyici gibi davranıyordu; Menü başlatmanın başka bir şey gerektirip gerektirmediğinden emin değilim. Bu basit örnekte, MenuClass sınıfı tamamen başlık dosyasının içinde tanımlanmıştır.

Kullanım, örnek kodunuza oldukça benzer, ancak artık MenuClass yapıcısı önceden oluşturulmuş bir TFT_ILI9163C ekran örneğine işaretçi gerektiriyor:

  // Ana uygulama # include <TFT_ILI9163C.h> # include " MenuClass.h "// ... etc ... // TFT_ILI9163C ekran örneğiTFT_ILI9163C tft = TFT_ILI9163C (cs, dc, rst); // displayMenuClass * menuFoo = new MenuClass (&tft); // yeni sınıf örneğine işaretçi almak için yeniyi kullanın // MenuClass * menuFoo = MenuClass (&tft); // initializationvoid setup () {// display menuFoo->setName ("Örnek") ekranını çizen örnek bir menüde 'MenuClass' 'MenuClass *' a dönüştürülemez; menuFoo->draw ();}  

Yapıcıya bir ilk Ad özellik değeri ve tft görüntüleme işaretçisini iletmek isterseniz, yapıcıyı

  public: // constructor MenuClass (TFT_ILI9163C * pTft, String name): m_tft (pTft), m_Name (name) {};  

Bir adım daha ileri gidebilirsiniz, ve ad bağımsız değişkenine varsayılan bir değer verin:

  public: // yapıcı MenuClass (TFT_ILI9163C * pTft, String adı = "Adsız"): m_tft (pTft), m_Name (ad) {}; 

Bu değişiklikle MenuClass (&myTFT) ifadesi, MenuClass (&myTFT, "Adsız") ifadesi ile aynıdır. , ancak yine de MenuClass (&myTFT, "DoSomething") gibi varsayılan değeri geçersiz kılabilirsiniz.

{} kod> yapıcının bloğu, ancak bu örnekte tüm iş : memba tarafından gerçekleştiriliyor erName (değer) yapıcı sözdizimi.

Düzenleme: MenuClass * menuFoo = new MenuClass (&tft); teşekkürler @BrettAM

`MenuClass * menuFoo = MenuClass (& tft);` bana balık gibi görünüyor, bu gerçekten derleniyor mu? `` MenuClass menuFoo (& tft); '' veya `MenuClass * menuFoo = new MenuClass (& tft); 'demek istediğiniz gibi görünüyor.


Bu Soru-Cevap, otomatik olarak İngilizce dilinden çevrilmiştir.Orijinal içerik, dağıtıldığı cc by-sa 3.0 lisansı için teşekkür ettiğimiz stackexchange'ta mevcuttur.
Loading...