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

 
 
> 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



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

 


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


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