2011-04-12 95 views
0

當我運行Setup()時,我希望在控制檯中看到't',後面跟着多個'x'字符。然而它只返回多個't'字符。這就像我的逆流永遠不會被過度糾纏。請參閱下面的代碼示例:重新聲明變量

class Returner 
{ 
    public: 
     Returner(){} 

     char test() 
     { 
     } 
}; 

class TReturner: public Returner 
{ 
    public: 
     TReturner(){} 

     char test() 
     { 
      return 't'; 
     } 
}; 

class XReturner: public Returner 
{ 
    public: 
     XReturner(){} 

     char test() 
     { 
      return 'x'; 
     } 
}; 

void setup() 
{ 
    Serial.begin(9600); 

    TReturner t = TReturner(); 
    Returner * retrn = &t; 

    while(1) 
    { 
     Serial.print(retrn.test()); 

     XReturner x = XReturner(); 
     retrn = &x; 

     _delay_ms(500); 
    } 
} 
+0

此代碼有多個問題。首先,基類'char test()'應該是虛擬的。你也沒有從這個函數返回任何值,你在哪裏指定返回類型爲'char'。接下來,像XReturner x = XReturner();這樣的語句是不必要的。你可以簡單地使用'XReturner x;'。我建議你在繼續閱讀之前閱讀一本好的C++書。 – Asha 2011-04-12 12:45:34

回答

0

我不能100%解釋這種行爲 - 我希望你不會得到任何打印的字符,因爲它會使用的是迴歸::測試 - 但是如果你用C++重寫一個函數,你需要聲明它的基類的虛:

class Returner 
{ 
    public: 
    Returner(){} 
    virtual char test() 
    {  
    } 
}; 

沒有測試是虛擬的,行

Serial.print(retrn.test()); 

(不要你的意思retrn->test()?)會隨便挑一個test實施,並始終用它。如上所述,我認爲這是空的Returner::test()。您可能還需要製作返回者::測試摘要

virtual char test() = 0; 

或返回一些值,如果您將它留給函數體。

+0

謝謝!我確實忘了「虛擬」。當然,我也指「retrn-> test()」;) – Marc 2011-04-12 12:56:14

0

setup()將由引導加載程序調用一次。 (不要在其中創建一個無限循環)
你應該定義一個loop()函數,它也會被bootloader調用一個'無限'的次數。