2011-04-12 97 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调用一个'无限'的次数。