2016-04-08 1 views
-1

Следующий код работает отлично ...Как использовать/передать ссылку на «это» в функции члена абстрактного класса?

class Printable { public: 
    virtual size_t printTo(Print& p) const = 0; 
}; 

class Printer : public Printable { public: 

    size_t printTo(Print& p) const { 
    return p.print("I am a printer"); 
    } 
}; 

Printer pp; 

void loop() { Serial.println(pp); } 

I am a printer ....

Однако, если я пытаюсь использовать эту новую найденную в печатные функции общественного члена Printer ..

void print() { Serial.println(this); } 

это кирпичи ...

error: call of overloaded 'println(Printer* const)' is ambiguous 
note: candidates are: 
    size_t Print::println(char) <near match> 
    note: no known conversion for argument 1 from 'Printer* const' to 'char' 
    size_t Print::println(unsigned char, int) <near match> 
    note: no known conversion for argument 1 from 'Printer* const' to 'unsigned char' 
    size_t Print::println(int, int) <near match> 
    note: no known conversion for argument 1 from 'Printer* const' to 'int' 

и т.д., и т.д. ... Но почему не компилятор найти «кандидат» (в том же Print заголовка, из которых Serial является подклассом) ...

size_t println(const Printable&); 

или даже

size_t println(void); 

Я перепробовал все низвержен this я мог пробуждать, без всякой магии. Невозможно ли вызывать абстрактные функции класса с помощью this?

Для всех тех, кто требует от compilable example... here you are.

+0

Где находится определение println? Пожалуйста, предоставьте реальный MCVE. – SergeyA

+0

_ «Просто невозможно вызвать абстрактные функции класса с помощью' this'? »_ Нет, это вполне возможно. Пожалуйста, добавьте [MCVE], который показывает, что вы не можете на самом деле. –

+0

Компилятор, кажется, однозначно говорит о том, что вы не объявили о перегрузке 'println', который принимает указатель на' Printer' в качестве аргумента. – Logicrat

ответ

1

Поскольку вы указали, что

void loop() { Serial.println(pp); } 

работы, я собираюсь рискну предположить, что вам нужно:

void print() { Serial.println(*this); } 
          // ^^ Need * before "this" 

this указатель на текущий объект. *this - объект, на который он указывает.

+0

Я думаю, что вы правы ... В моей спешке создать «приемлемый» пример кода ... Я попытался с помощью такого простого указателя и _voila_! Позвольте мне дважды проверить в реальной среде Arduino .. но я думаю, что вы на деньги. :-) –