Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: C++ создание экземпляра класса внутри класса
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
plombir
Добрый день!

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();
    ...
};
Палыч
Цитата(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;

    ...
};
Сергей Борщ
Цитата(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)
{
....
}
IgorKossak
Ничуть не умаляя аргументов Сергей Борщ и Палыч:
Multiply inheritance поддерживается в версии 5.20.
Может быть и в 5.10, попробуйте включить Extended Embedded C++ в опциях компилятора.
plombir
Всем Большое спасибо! Очень помогли.

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

IgorKossak
Вы правы, стоял не Extended, поставил галку и заработал Multiply inheritance.
HARMHARM
Цитата(Сергей Борщ @ 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.
plombir
И всё таки поясню. Проблема у меня была не в ошибке иерархии классов, а немного в другом.

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

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

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

Теперь, после ответов форумчан Палыч и Сергей Борщ, я могу с легкостью в гугле найти нужные примеры для ответа на мой вопрос.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.