Переопределение переменной - PullRequest
0 голосов
/ 12 апреля 2011

Когда я запускаю 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);
    }
}

Ответы [ 2 ]

0 голосов
/ 12 апреля 2011

Я не могу на 100% объяснить это поведение - я ожидаю, что вы не напечатаете никаких символов, как это было бы при использовании Returner :: test - но если вы переопределяете функцию в C ++, вам нужно объявитьон виртуален в базовом классе:

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

Если тест не является виртуальным, строка

Serial.print( retrn.test() );

(вы не имеете в виду retrn->test()?) просто выберет одну реализацию test и используйте его всегда.Как и выше, я ожидаю, что это будет пустой Returner::test().Вам также может понадобиться сделать Returner :: test abstract

    virtual char test() = 0;

или вернуть некоторое значение, если вы оставляете его с телом функции.

0 голосов
/ 12 апреля 2011

setup () будет вызван один раз загрузчиком. (не создавайте внутри него бесконечный цикл)
Вы должны определить функцию loop (), она также будет вызываться загрузчиком бесконечное число раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...