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

 
 
 
Reply to this topicStart new topic
> C++ создание экземпляра класса внутри класса
plombir
сообщение Jun 2 2009, 12:11
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 99
Регистрация: 14-12-05
Пользователь №: 12 191



Добрый день!

IAR 5.10A, AVR
Есть два класса AT45LOG и CRC16. Первый наследует ещё один. Можно ли, если да, то как, объявить класс CRC16 внутри класса AT45LOG, чтобы при создании его экземпляра создавался и экземпляр CRC16?
Сейчас сделано так, что AT45CRC объявлен глобальным. Хочется от этого избавиться.
На множественное наследование IAR ругается "Error[Pe882]: Embedded C++ does not support multiple or virtual inheritance..."

Код
class CRC16 AT45CRC(0xFFFF, 0x1021); //избавиться от этой строчки

class AT45LOG : public AT45
{
    ...
};

class CRC16
{
    public:
    CRC16(unsigned int init, unsigned int polinom);
    ~CRC16();
    ...
};
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 2 2009, 12:23
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(plombir @ Jun 2 2009, 15:11) *
Можно ли, если да, то как, объявить класс CRC16 внутри класса AT45LOG, чтобы при создании его экземпляра создавался и экземпляр CRC16?
Не понятно: что же Вы хотите? Вот Так?
Код
class CRC16
{
    public:
    CRC16(unsigned int init, unsigned int polinom);
    ~CRC16();
    ...
};

class AT45LOG : public AT45
{
  CRC16 AT45CRC;

    ...
};
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 2 2009, 12:39
Сообщение #3


Гуру
******

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



Цитата(plombir @ Jun 2 2009, 15:11) *
Можно ли, если да, то как, объявить класс CRC16 внутри класса AT45LOG, чтобы при создании его экземпляра создавался и экземпляр CRC16?
Сдается, ошибка в проектировании иерархии классов. Помните, Страуструп писал об отношениях "is-a" и "has-a". Задайте себе вопрос: является ли ваш AT45LOG CRCой? Скорее всего нет. Значит, отношение "is-a" ("является") не подходит и наследование тут неуместно. С другой стороны, на вопрос "содержит ли AT45LOG в себе CRC?" можно ответить положительно. Значит, имеет место отношение "has-a" ("содержит") и целесообразно сделать объект типа CRC членом класса AT45LOG. Как это сделать - Палыч написал. А конструктор члена можно "пристроить" так же, как и конструктор базового класса. Надо только помнить, что сначала вызываются конструкторы всех базовых класов, потом конструкторы членов и только потом конструктор создаваемого объекта:
Код
class AT45LOG : public AT45
{
public:
    AT45LOG();
private:
    CRC16 CRC;
  ....
}
AT45LOG::AT45LOG()
: CRC(0xFFFF, 0x1021)
{
....
}


--------------------
На любой вопрос даю любой ответ
"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
IgorKossak
сообщение Jun 2 2009, 12:45
Сообщение #4


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Ничуть не умаляя аргументов Сергей Борщ и Палыч:
Multiply inheritance поддерживается в версии 5.20.
Может быть и в 5.10, попробуйте включить Extended Embedded C++ в опциях компилятора.
Go to the top of the page
 
+Quote Post
plombir
сообщение Jun 2 2009, 14:02
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 99
Регистрация: 14-12-05
Пользователь №: 12 191



Всем Большое спасибо! Очень помогли.

Для меня вот эта конструкция языка С++ оказалась новой:
AT45LOG::AT45LOG() : CRC(0xFFFF, 0x1021) {}

IgorKossak
Вы правы, стоял не Extended, поставил галку и заработал Multiply inheritance.
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение Jun 3 2009, 04:48
Сообщение #6


читатель даташитов
****

Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999



Цитата(Сергей Борщ @ Jun 2 2009, 15:39) *
Сдается, ошибка в проектировании иерархии классов.

Похоже на то. Есть такая отличная книга, Thinking in C++, там разжевано очень просто:
Цитата
One of the clearest ways to determine whether you should be using composition or inheritance is by asking whether you’ll ever need to
upcast from your new class.
Go to the top of the page
 
+Quote Post
plombir
сообщение Jun 3 2009, 17:58
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 99
Регистрация: 14-12-05
Пользователь №: 12 191



И всё таки поясню. Проблема у меня была не в ошибке иерархии классов, а немного в другом.

Есть простая аксиома: формулирование правильного вопроса – половина ответа. В идеале, правильно заданный вопрос, в этой теме, должен быть таким: "Какой синтаксис используется в IAR для вызова конструктора базового класса?"

Это сейчас мне данный вопрос понятен и прозрачен. Ещё раз, спасибо всем, кто откликнулся и помог. Хотя, если утрированно исходить из того, что класс, это та же структура, то за каким "лесом" разработчики Си впихнули создание базового экземпляра в заголовок конструктора. Логичнее в теле конструктора совершать подобные манипуляции, и двигаться последовательно сверху вниз создавая требуемые объекты.

Но, если я в своём вопросе применил бы слово «синтаксис», то, с большой вероятностью, был бы мягко аутлуплен к книгам, в которых разжевываются подобные цитаты: "One of the clearest ways to determine whether…" без примеров.

Теперь, после ответов форумчан Палыч и Сергей Борщ, я могу с легкостью в гугле найти нужные примеры для ответа на мой вопрос.
Go to the top of the page
 
+Quote Post

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

 


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


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