|
|
  |
C++ создание экземпляра класса внутри класса |
|
|
|
Jun 2 2009, 12:11
|
Частый гость
 
Группа: Участник
Сообщений: 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(); ... };
|
|
|
|
|
Jun 2 2009, 12:39
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Jun 3 2009, 04:48
|

читатель даташитов
   
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Jun 3 2009, 17:58
|
Частый гость
 
Группа: Участник
Сообщений: 99
Регистрация: 14-12-05
Пользователь №: 12 191

|
И всё таки поясню. Проблема у меня была не в ошибке иерархии классов, а немного в другом.
Есть простая аксиома: формулирование правильного вопроса – половина ответа. В идеале, правильно заданный вопрос, в этой теме, должен быть таким: "Какой синтаксис используется в IAR для вызова конструктора базового класса?"
Это сейчас мне данный вопрос понятен и прозрачен. Ещё раз, спасибо всем, кто откликнулся и помог. Хотя, если утрированно исходить из того, что класс, это та же структура, то за каким "лесом" разработчики Си впихнули создание базового экземпляра в заголовок конструктора. Логичнее в теле конструктора совершать подобные манипуляции, и двигаться последовательно сверху вниз создавая требуемые объекты.
Но, если я в своём вопросе применил бы слово «синтаксис», то, с большой вероятностью, был бы мягко аутлуплен к книгам, в которых разжевываются подобные цитаты: "One of the clearest ways to determine whether…" без примеров.
Теперь, после ответов форумчан Палыч и Сергей Борщ, я могу с легкостью в гугле найти нужные примеры для ответа на мой вопрос.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|