Наследование, базовые методы и

klvd
Offline
Зарегистрирован: 22.04.2022

Хочу сделать обвеску библиотеки EthernetServer
чтобы выводить в порт то, что отправляется ей методом print

Делаю наследника
class VEthernetServer : public EthernetServer
{
public:
VEthernetServer(uint16_t port):EthernetServer(port){};
size_t print(const __FlashStringHelper *);
size_t print(const String&);
size_t print(const char[]);
size_t print(char);
........
}

#include "EthernetServer.h"

size_t print(const __FlashStringHelper * f)
{
return EthernetServer::print(f);
}

size_t print(const String & s)
{
return EthernetServer::print(s);
};

size_t print(const char[] ch)
{
Serial.print(ch);
return EthernetServer::print(&ch);
};

size_t print(char c)
{
return EthernetServer::print(c);
};
.....

Но получаю ошибки:
первая - VEthernetServer.cpp:21:39: error: cannot call member function 'size_t Print::print(char)' without object
вторая - error: expected ',' or '...' before 'ch' size_t print(const char[] ch)

rkit
Offline
Зарегистрирован: 23.11.2016

Верно получаешь. Что это вообще такое ты изобретаешь? Для начала пройдись по всей иерархии классов и определисть как print работает.

klvd
Offline
Зарегистрирован: 22.04.2022

Да я не изобретаю.... 
Смысл такой - есть готовый проект, который использует библиотеку EthernetServer, посылая ей из разных уголков проекта методами print разные значения (обмен данными).

Мне хочется сделать что-то типа "сниффера", повесив логгер на каждый из методов print, дабы не лазать по всему могучему проекту и не вставлять везде Serial.print.

Идея была унаследовать класс и в каждом из методов print поставить вывод в лог И ВЫЗОВ ОСНОВНОГО print.

size_t print(char c)
{
    Serial.print(c);
    return EthernetServer::print(c);
}

Это, наверное, моё Java "мышление". Там то это легко через override и super.print(c), а тут что-то ругается

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

переопредели в своём классе метод write(), он виртуальный

klvd
Offline
Зарегистрирован: 22.04.2022

Так в проекте во множестве уголков используется именно print

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

если это то, что я думаю, любой из print() внутри вызывает write() для вывода одного символа, вот здесь и перехватывай, единственной функцией в единственном месте.

rkit
Offline
Зарегистрирован: 23.11.2016

rkit пишет:

Для начала пройдись по всей иерархии классов и определисть как print работает.

для особо недоходчивых повторю

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

klvd,

1.
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...

если Вы этого не поймёте и будете продолжать выкладывать код так, как сейчас, я больше не буду делать замечаний - просто слиняю из темы. Разбирайтесь сами.

klvd пишет:
EthernetServer::print(c); };
Это что? Что по Вашему это означает? Вы понимаете разницу между "автомобилем вообще" и конкретным экземпляром автомобиля? Так вот здесь Вы пытаетесь "грузить апельсины бочками" не в конкретный автомобиль, а в "автомобиль вообще". Как Вы себе это видите? Именно об этом Вам говорит компилятор

klvd пишет:
VEthernetServer.cpp:21:39: error: cannot call member function 'size_t Print::print(char)' without object

Читайте любой учебник и попытайтесь понять разницу между классом и экземпляром (объектом) класса.

klvd пишет:
error: expected ',' or '...' before 'ch' size_t print(const char[] ch)

Не понимаю, что Вы хотели написать, но то, что написано является бессмысленным набором символов. Поэтому никак не могу прокомментировать.