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

 
 
> 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
 
Start new topic
Ответов
Сергей Борщ
сообщение Jun 2 2009, 12:39
Сообщение #2


Гуру
******

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


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

Группа: Свой
Сообщений: 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



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

 


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


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