реклама на сайте
подробности

 
 
> 2 вопроса по Си++, WinAVR
kurtis
сообщение Aug 18 2008, 13:06
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205



Вопрос 1:
Есть функция getErrorPacket(), она является частью класса Etaz_item, который в конструкторе принимает ссылку на класс типа NetTransferConstrol, который уже в свою очередь содержит функцию get_error_packet(), которая ""генерирует" исходные данные.
Упрощенно класс Etaz_item выглядит следующим образом
Код
class NetTransferConstrol;

class Etaz_item: public TechObj
{
    private:
        NetTransferConstrol & cBfppClass;
    public:
        void func1();
        void func2();
        uint8_t getErrorPacket()
        {            
            return cBfppClass.get_error_packet();            
        };
        Etaz_item ( NetTransferConstrol & _cBfppClass )
                    : cBfppClass ( _cBfppClass )
        {
            //.......
        };
};

т.е. есть какой-то класс NetTransferConstrol, описание которого находится где-то в другом месте, и сам класс Etaz_item, который принимает ссылку на обьект типа NetTransferConstrol. К классу Etaz_item относится 2 файла : Etaz.cpp, где описан код реализации всех функций класса, и Etaz.h, где находится реализация структуры класса.
И вот тут начинаются непонятные вещи, когда я код функции getErrorPacket() помещаю в Etaz.cpp, то проект компилируется, но если я перемещая код функции в класс, как показано в примере, то компилятор начинает ругаться
Цитата
./src/Etaz.h:166: error: invalid use of incomplete type 'struct NetTransferConstrol'
./src/Etaz.h:122: error: forward declaration of 'struct NetTransferConstrol'

Почему компилятор генерирует ошибку в случае когда код функции описан прямо в классе, но ничего не выдает, когда эта же функция описана во внешнем файле(Etaz.cpp)? Возможно как-то получается ситуация когда класс типа Etaz_item "родился", а класс типа NetTransferConstrol еще нет, но тогда совсем непонятно как оно работает и где оно берет ссылку... И непонятно причем тут "struct NetTransferConstrol", ведь NetTransferConstrol обьявлен как class?
Пробовал имитировать подобную ситуацию в MinGW, но там все компилируется без проблем, так что считаю что это не синтаксическая ошибка...

Вопрос 2:
Как мне убедится что на момент создания класса Etaz_item, обьект типа NetTransferConstrol уже существует, и ссылка будет правильной?

Всем заранее спасибо за помощь!!! smile.gif
З.Ы. Компилятор WinAVR 20080610
З.Ы.Ы. Обьекты создаются статически во время начальной инициализации
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Amper25
сообщение Aug 20 2008, 09:06
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 215
Регистрация: 10-04-07
Пользователь №: 26 929



Ну что поаргументирую тут...

"Ужасов" конечно никаких нет. Но в "оправдание" могу привести:
1.Когда пишеш в "процедурном" стиле, всегда знаеш во что это откомпилируется.
А выполняя:
MY_CLASS *MC_PTR = new(MY_CLASS);
ХЗ сколько времени и памяти уйдет на инициализацию, надо читать конструктор.

2.Используя объекты, при создании нового, все внутренние переменные класса помещаются в Heap. А если нам не нужны все они, а мы лиш только хотим выполнить putchar() и закрыть класс?

3.Касательно AVR, то для самых навороченных с 4k и даже аж 8k :)RAM как то вера не позволяет разбазаривать её на право и налево.

4.Для других MCU, и тем более в RTOS конечно объектных подход более приемлим. И не могу не согласится, с тем что код лучше читаем. Тут Сергей Борщ прав.

PS: кстати,

void dump(uint8_t );
void dump(uint16_t );
void dump(char const *);
void dump(my_struct_t *);

никто не запрещает сделать C++ -шной перезагрузкой функций, безо всяких объектов.

Да, забыл упомянуть более легкую портабельность кода при использовании объектов.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Aug 20 2008, 11:00
Сообщение #3


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(Amper25 @ Aug 20 2008, 12:06) *
1.Когда пишеш в "процедурном" стиле, всегда знаеш во что это откомпилируется.
А выполняя:
MY_CLASS *MC_PTR = new(MY_CLASS);
ХЗ сколько времени и памяти уйдет на инициализацию, надо читать конструктор.
Дежавю какое-то :-)
Когда лет 12 назад в RU.EMBEDDED нас несколько человек "уговаривали" народ пользоваться С, наиболее часто встречающимся контраргументом было именно это - "когда я пишу на асме, я знаю что будет, а написав строку на си ХЗ сколько времени и памяти..."

Цитата(Amper25 @ Aug 20 2008, 12:06) *
2.Используя объекты, при создании нового, все внутренние переменные класса помещаются в Heap. А если нам не нужны все они, а мы лиш только хотим выполнить putchar() и закрыть класс?
Ну знаете, если на С работу с UART построить таким образом, что на каждый чих будут malloc-ом выделяться байт для временного размещения передаваемого символа и т.п., то тоже никакой памяти не хватит.
Как по мне - если в изделии используется UART, то нет никакой необходимости его "открывать-закрывать", если для UART используются буфера FIFO, то и на С они выделяются статически, равно как и переменные, связанные с протоколом, если таковые имеются, а не malloc-аются/free-шаются постоянно.
Почему надо С++ ставить в заведомо неравные условия?
Создавайте экземпляр класса UART статически и не будет вообще подшиваться код системы new/delete, памяти выделится столько же, сколько при равном функционале на С.

Цитата(Amper25 @ Aug 20 2008, 12:06) *
3.Касательно AVR, то для самых навороченных с 4k и даже аж 8k :)RAM как то вера не позволяет разбазаривать её на право и налево.
Вот то же самое говорилось и в asm vs C, только на уровне "даже для самых навороченных с 256 или даже 512 байтов" :-)


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- kurtis   2 вопроса по Си++   Aug 18 2008, 13:06
- - Amper25   Ох уж эти HighLevel программеры. Ну зачем для MCU,...   Aug 18 2008, 13:31
- - SamHaris   Я бы так писал: Код#include <NetTransferConstr...   Aug 19 2008, 04:32
- - Сергей Борщ   Цитата(kurtis @ Aug 18 2008, 16:06) Вопро...   Aug 20 2008, 05:54
- - Kuzmi4   2 Сергей Борщ Цитата..Не поверите - чтобы использ...   Aug 20 2008, 07:30
|- - Сергей Борщ   Цитата(Kuzmi4 @ Aug 20 2008, 10:30) 2 Сер...   Aug 20 2008, 07:59
- - Kuzmi4   2 Сергей Борщ - ага , что-то похожее я встречал ко...   Aug 20 2008, 08:32
|- - dch   не используйте C++ - для коммерческого софта это н...   Aug 20 2008, 08:47
|- - sergeeff   Цитата(dch @ Aug 20 2008, 12:47) не испол...   Aug 20 2008, 09:25
- - Kuzmi4   2 dch - это почему же ??   Aug 20 2008, 08:47
|- - dch   Цитата(Kuzmi4 @ Aug 20 2008, 12:47) 2 dch...   Aug 20 2008, 15:35
|- - Сергей Борщ   Цитата(Amper25 @ Aug 20 2008, 12:06) Пока...   Aug 20 2008, 11:55
- - Amper25   Ну соглсен в принципе. Для успокоения души давай...   Aug 20 2008, 11:13
|- - Огурцов   Цитата(Amper25 @ Aug 20 2008, 11:13) Для ...   Aug 20 2008, 11:41
- - Amper25   Цитатазаказчик может сказать - не использовать опр...   Aug 20 2008, 15:51


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 19:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01371 секунд с 7
ELECTRONIX ©2004-2016