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

 
 
> 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
Ответов
Kuzmi4
сообщение Aug 20 2008, 07:30
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



2 Сергей Борщ
Цитата
..Не поверите - чтобы использовать преимущества объектного программирования...


Не могли бы вы привести тогда пару примеров ?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 20 2008, 07:59
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Kuzmi4 @ Aug 20 2008, 10:30) *
2 Сергей Борщ
Не могли бы вы привести тогда пару примеров ?
Легко. Вот только некоторые:
Инкапсуляция - группирование взаимосвязанных элементов (данные, функции для работы именно с этими данными) в один класс и ограничение доступа к этим данным и функциям извне.
Пространства имен - тоже группирование и уменьшение писанины.
Наследование - построение иерархии данных.
Шаблоны - вместо copy-paste и мелких правок похожих функций пишется шаблон.
Переопределение операторов и функций:
Код
class uart_t
public:
    void dump(uint8_t );
    void dump(uint16_t );
    void dump(char const *);
    void dump(my_struct_t *);
};
struct my_struct_t
{
    ......
    bool operator=(mystruct &);
};
вместо
   void uart_dump_uint8_t(uint8_t);
   void uart_dump_uint16_t(uint16_t);
   void uart_dump_string(char const *);
   void uart_dump_mystruct(my_struct_t *);
   bool compare_my_struct(my_struct_t *, my_struct_t *);
Использование принципа "создание объекта есть инициализация" - когда некое начальное действие (например - запрещение прерываний или формирование заголовка пакета) происходит при создании объекта в его конструкторе и некторое завершающее действие (например - разрешение прерываний или формирование окончания пакета) в его деструкторе. Просто создаете объект и уверены, что после выхода объекта из зоны видимости завершающее действие будет сделано. При обычном подходе вам надо завершающее действие тоже прописать вручную. Это можно забыть сделать, особенно если функция имеет несколько точек выхода, в каждой из которых это действие должно быть выполнено.

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

Теперь, возможно, Amper25 приведет описание ужасов объектного подхода, из-за которых "для MCU, тем более для AVR" не нужно его использовать?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
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, 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, 09:06
|- - ReAl   Цитата(Amper25 @ Aug 20 2008, 12:06) 1.Ко...   Aug 20 2008, 11:00
|- - Сергей Борщ   Цитата(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 Текстовая версия Сейчас: 24th July 2025 - 14:05
Рейтинг@Mail.ru


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