Easyelectronics.ru

Электроника для всех
Текущее время: 24 янв 2020, 06:47

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 27 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Синтаксис С++
СообщениеДобавлено: 02 окт 2016, 01:15 
Заглядывает иногда

Зарегистрирован: 30 июн 2015, 14:16
Сообщения: 55
Пытаюсь реализовать наследование

Код:
class first
{
public:
    enum var : uint8_t {val1, val2};
    first ();
    void func (var v);
};

class second : public first
{
public:
    second ();
};


создаю объект класса second

second a;

и пытаюсь вызвать метод func

a.func (second::val1);
и так тоже
a.func (first::val1);

компилятор ругается что сигнатуры не соответствуют

Кто знает как правильно?


Последний раз редактировалось creator83 02 окт 2016, 01:26, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Синтаксис С++
СообщениеДобавлено: 02 окт 2016, 01:23 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 655
Откуда: Германия
Оба варианта верные. Не хватает "public:" перед "second ();"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Синтаксис С++
СообщениеДобавлено: 02 окт 2016, 01:27 
Заглядывает иногда

Зарегистрирован: 30 июн 2015, 14:16
Сообщения: 55
dev писал(а):
Оба варианта верные. Не хватает "public:" перед "second ();"


Это здесь косякнул, с конструктором проблем нет.


Разобрался - в методе была ссылка void func (var &)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Синтаксис С++
СообщениеДобавлено: 02 окт 2016, 11:29 
Заглядывает иногда

Зарегистрирован: 16 окт 2013, 20:15
Сообщения: 170
Откуда: Екатеринбург
В случае с наследованием ещё виртуальный деструктор в базовом классе не помешал бы


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Синтаксис С++
СообщениеДобавлено: 22 ноя 2016, 12:52 
Заглядывает иногда

Зарегистрирован: 04 сен 2014, 12:44
Сообщения: 96
Если можно то задам свой вопрос сюда же, ибо по теме близко.
Надо в базовом классе объявить функцию, так чтобы была обязательна её реализация в дочерних классах. То есть если нет реализации функции в дочернем классе, то компилятор ругается. Либо другим способом, запретить вызов этой функции из родительского класса. Как сие достигнуть ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Синтаксис С++
СообщениеДобавлено: 22 ноя 2016, 12:58 
Заглядывает иногда

Зарегистрирован: 04 сен 2014, 12:44
Сообщения: 96
решен мой вопрос ))) virtual void f() = 0;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Синтаксис С++
СообщениеДобавлено: 25 ноя 2016, 13:47 
Заглядывает иногда

Зарегистрирован: 30 июн 2015, 14:16
Сообщения: 55
Столкнулся с проблемой:

объявил структуры
Код:
struct data
{
    uint16_t value;
    position pos;   
}speed, currTemp, setTemp, pVal, iVal, dVal;

объявил массив указателей:
Код:
data * ScreenVal [2] [3] = {
    {&speed, &setTemp, &currTemp},
    {&pVal, &iVal, &dVal}
};

в одном месте понадобилось ещё один указатель на этот массив
Код:
data **tempPtr = &ScreenVal[0][0];

при попытке
Код:
*tempPtr->value = 2;

выдаёт ошибку Error[Pe131]: expression must have pointer-to-class type

Ларчик просто открывался ))

Код:
(*tempPtr)->value = 2;


Последний раз редактировалось elisey 25 ноя 2016, 14:19, всего редактировалось 1 раз.
Выкладывать код нужно с использованием тэгов [code]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Синтаксис С++
СообщениеДобавлено: 24 дек 2016, 20:43 
Заглядывает иногда

Зарегистрирован: 30 июн 2015, 14:16
Сообщения: 55
Пытаюсь узнать количество элементов полиморфного контейнера

Код:
Shape * layer1[]= {};
Horline hLine (120, 0, colors16bit::WHITE, 320, 5);
Verline vline (0, 100, colors16bit::WHITE, 200, 5);

layer1[0] = &hLine;
layer1[1] = &vline;
uint8_t n = sizeof layer1/sizeof *layer1;


формула не работает, кто знает подскажите


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Синтаксис С++
СообщениеДобавлено: 25 дек 2016, 01:31 
Старожил
Аватара пользователя

Зарегистрирован: 11 авг 2016, 20:52
Сообщения: 680
Откуда: GMT+6
Для начала выделите память под массив, а уже потом делите размер указателя на размер элемента.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Синтаксис С++
СообщениеДобавлено: 25 дек 2016, 01:42 
Заглядывает иногда

Зарегистрирован: 15 ноя 2015, 12:11
Сообщения: 175
creator83 писал(а):
Пытаюсь узнать количество элементов полиморфного контейнера

Код:
Shape * layer1[]= {};
Horline hLine (120, 0, colors16bit::WHITE, 320, 5);
Verline vline (0, 100, colors16bit::WHITE, 200, 5);

layer1[0] = &hLine;
layer1[1] = &vline;
uint8_t n = sizeof layer1/sizeof *layer1;



sizeof - не функция, компилятором исчисляется. Впрочем "инициализация" layer1 тоже как-бы по виду статическая, но как компилятор умудрится угадать число элементов - то неизвестно. Скорее всего будет ошибка компиляции. Что за компилятор-то?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Синтаксис С++
СообщениеДобавлено: 25 дек 2016, 01:45 
Заглядывает иногда

Зарегистрирован: 15 ноя 2015, 12:11
Сообщения: 175
Воспользуйтесь vector-ом:
Код:
#include <vector>

std::vector<Shape*> layer1;
Horline hLine (120, 0, colors16bit::WHITE, 320, 5);
Verline vline (0, 100, colors16bit::WHITE, 200, 5);

layer1.push_back(&hLine);
layer1.push_back(&vline);

uint8_t n = layer1.size();


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Синтаксис С++
СообщениеДобавлено: 25 дек 2016, 01:46 
Заглядывает иногда

Зарегистрирован: 30 июн 2015, 14:16
Сообщения: 55
Kelvin, каким образом? Хотите сказать что массив не создан?
Если пройтись по массиву
Код:
for (uint8_t k=0;k<2;++k)
{
   layer1[k]->draw();
}


то всё работает

И если указать явно количество элементов
Код:
Shape * layer1[3]= {};


то и кол-во элементов считает


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Синтаксис С++
СообщениеДобавлено: 25 дек 2016, 01:57 
Заглядывает иногда

Зарегистрирован: 30 июн 2015, 14:16
Сообщения: 55
siarzhuk,
gnu iso 2011 c++
пробовал до этого векторы, работает, но на микроконтроллерах cortex-m0 много ресурсов жрёт


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Синтаксис С++
СообщениеДобавлено: 25 дек 2016, 02:02 
Старожил
Аватара пользователя

Зарегистрирован: 11 авг 2016, 20:52
Сообщения: 680
Откуда: GMT+6
creator83 писал(а):
каким образом? Хотите сказать что массив не создан?
Если пройтись по массиву
то всё работает
Массив, как выше заметили, создан статически и создан на 0 элементов. А работает это потому, что вам повезло не влезть в память другого процесса и не задеть память собственных переменных.

И ещё, sizeof размер массива вернет только для статического массива, для динамического будет размер указателя.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Синтаксис С++
СообщениеДобавлено: 26 дек 2016, 02:19 
Заглядывает иногда

Зарегистрирован: 15 ноя 2015, 12:11
Сообщения: 175
creator83 писал(а):
Если пройтись по массиву [...] то всё работает

Массив указателей создается на стеке функции - если добавлять в него элементы сверх выделенных ему пределов, будут переписываться соседние переменные, с выходом в конце концов на адрес возврата функции. Для интересу гляньте адреса соседних локальных переменных, адрес массива, адреса 1-го, 2-го, 3-го и т.д. элементов массива. Подозреваю, что они перекрываются.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Синтаксис С++
СообщениеДобавлено: 26 дек 2016, 10:26 
Заглядывает иногда

Зарегистрирован: 30 июн 2015, 14:16
Сообщения: 55
Kelvin, спасибо, ответ исчерпывающий. В общем нужно реализовать через динамические структуры данных.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Синтаксис С++
СообщениеДобавлено: 27 дек 2016, 12:48 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 855
Можете использовать связные списки в стиле Линукс (list_head).
Это статическая структура, которая работает со специально введенными полями в связываемых объектах.

Код:
struct Verline {
//Manage Fields.
struct list_head lnk;

//Data Fields.
int data0;
int data1;
int data2;
}

...

struct list_head layer1;

...

list_init(&layer1);

Verline node;
list_add(&node->lnk, &layer1);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Синтаксис С++
СообщениеДобавлено: 19 апр 2017, 15:30 
Заглядывает иногда

Зарегистрирован: 30 июн 2015, 14:16
Сообщения: 55
Пытаюсь реализовать интерфейс для драйвера lcd.

Код:

class Tftdriver
{
public:
   virtual void pixel (uint16_t x , uint16_t y, const uint16_t color) = 0;
   virtual ~Tftdriver(){}
};

class Ili9341: public Tftdriver
{
//variables
private:
   Spi * spiDriver;
   Dma * dma;
   Pin dc, rst;
//functions
public:
   Ili9341(Spi &, Gpio::Port po, uint8_t p, Gpio::Port rstpo, uint8_t rstpi);
        void pixel (uint16_t x , uint16_t y, const uint16_t color) override;
}


При компиляции выдаёт ошибку "undefined reference to `vtable for Ili9341'"
В чем проблема может быть?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Синтаксис С++
СообщениеДобавлено: 19 апр 2017, 15:36 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 15:41
Сообщения: 1127
Откуда: Германия
creator83 писал(а):
Пытаюсь реализовать интерфейс для драйвера lcd.

При компиляции выдаёт ошибку "undefined reference to `vtable for Ili9341'"
В чем проблема может быть?

у Tftdriver конструктора не видать

_________________
Мои поделки
http://www.fun-electronic.net/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Синтаксис С++
СообщениеДобавлено: 19 апр 2017, 15:41 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1047
creator83 писал(а):
Пытаюсь реализовать интерфейс для драйвера lcd.

Делать функцию отрисовки пикселя виртуальной - не очень хорошая идея.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Синтаксис С++
СообщениеДобавлено: 19 апр 2017, 15:43 
Заглядывает иногда

Зарегистрирован: 30 июн 2015, 14:16
Сообщения: 55
MasterAlexei, так это же pure abstract class

Reflector, помимо пикселя есть и строки, символы и т.д.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Синтаксис С++
СообщениеДобавлено: 19 апр 2017, 16:31 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 15:41
Сообщения: 1127
Откуда: Германия
Хе хе. Вы удивитесь. Но если вы не написали конструктор, компилятор сделает это за вас, еще добавит Copy Constructor и operator= . Даже если вы их не написали.
Но в данном случае, ему все же не хватает какой то информации об этом.
Но мне все же кажется, что так.
Есть еще одна догадка (так как нам не видно файла реализации (.срр)), что конструктор Ili9341 в хедере записан так, а в cpp файле чуток по другому, с другим списком параметров.
Тоже самое относится к функциям.

_________________
Мои поделки
http://www.fun-electronic.net/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Синтаксис С++
СообщениеДобавлено: 19 апр 2017, 16:42 
Заглядывает иногда

Зарегистрирован: 30 июн 2015, 14:16
Сообщения: 55
MasterAlexei,
библиотеку ili9341 использовал без интерфейса (класс TftDriver), если бы были разные сигнатуры в объявлении и реализации, то были бы ошибки, но всё равно проверил - одинаковые.

также реализовал интерфейс графического класса

Код:
class Shape
{
public:

   Tftdriver * displayDriver;
public:
   virtual void draw () const = 0;
   virtual void setPosition (uint16_t x, uint16_t y)  = 0;
   virtual ~Shape(){}
};

и к нему наследников строка, фигуры разные и т.д.
Shape работает как надо. Не пойму почему с Tftdriver проблемы


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Синтаксис С++
СообщениеДобавлено: 19 апр 2017, 18:01 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 855
Ошибка
Код:
undefined reference to `vtable for

Означает, что не найдена реализация одного из виртуальных методов.

Скорее всего, вы эту реализацию или не написали, или она не скомпилировалась по каким-то причинам.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Синтаксис С++
СообщениеДобавлено: 19 апр 2017, 18:08 
Заглядывает иногда

Зарегистрирован: 30 июн 2015, 14:16
Сообщения: 55
Mirmik, тоже видел такое объяснение.
Во-первых перепроверил, во-вторых урезал интерфейс до 1-го метода, чтобы исключить эту ошибку.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 27 ]  На страницу 1, 2  След.


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB