Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Зацените класс и посоветуйте... ...как его можно сделать лучше 
:(
    Опции темы
mr.DUDA
  Дата 23.4.2004, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Цель - написать класс-контейнер данных (прога - эмулятор микроконтроллера), который бы хранил байт, слово, двойное слово или бит по выбору, предоставлял удобный доступ к данным, но главное - давал возможность создать связку между 2-мя и более объектами такого класса. Идея: имеется объект, хранящий слово, и мы создаём второй объект, проецирующийся на младший байт первого объекта, третий объект - на старший бит второго объекта и т.п.

Оцените, плиз, и посоветуйте что бы здесь можно было сделать по-другому:
Цитата
#define MINUS1 0xffffffff

class CS68DataCell
{
// данные
private:
 
DWORD  value; // хранимое значение
 
DWORD  mask; // маска для AND
 
bool  read_only; // только для чтения ?
 
bool  is_reference; // ссылка или нет
 
byte  start_bit; // позиция правого бита маски

// защищённые методы
protected:

 
// изменить маску, задан правый и [левый] бит(ы)
 
void  ModifyParams(DWORD iStartBit, DWORD iEndBit=MINUS1)
  {
   
start_bit = iStartBit = (iStartBit>31?31:iStartBit);
   
iEndBit = (iEndBit==MINUS1?(iStartBit): (iEndBit>31?31:iEndBit));
   
mask = iStartBit==0?MINUS1: ((MINUS1>>iStartBit)<<iStartBit);
   
if(iEndBit != 31) mask &= ((MINUS1<<(31-iEndBit))>>(31-iEndBit));
   
value = 0;
  }

 
// изменить значение в соответствии с маской и ссылкой
 
void  ModifyValue(DWORD val)
  {
   
if(is_reference)
    {
     
DWORD nval = ((CS68DataCell*)value)->Value();
     
nval = (nval&(~mask)) | ((val<<start_bit)&mask);
      ((
CS68DataCell*)value)->ModifyValue(nval);
    }
   
else value = (val<<start_bit)&mask;
  }

 
// сброс всех параметров
 
void  Clear()
  {
   
value=NULL;
   
read_only=is_reference=false;
   
mask=MINUS1;
   
start_bit=0;
  }
 

// интерфейс к личным данным
public:
 
bool  IsRef() const {return is_reference;}
 
DWORD  Mask() const {return mask;}
 
DWORD  Value() const
 
{
   
DWORD val = is_reference?(((CS68DataCell*)value)->operator DWORD()):value;
   
return (val&mask)>>start_bit;
  }
 
bool  &ReadOnly() {return read_only;}


// конструкторы, запись и чтение значения
public:
 
// конструкторы
 
CS68DataCell(int iStartBit=MINUS1, int iEndBit=MINUS1)
  {
   
Clear();
   
ModifyParams(iStartBit, iEndBit);
  }

 
CS68DataCell(CS68DataCell *ref, int iStartBit=MINUS1, int iEndBit=MINUS1)
  {
   
Clear();
   
if(iStartBit==MINUS1) mask = ref->Mask();
     
else ModifyParams(iStartBit, iEndBit);
   
is_reference = true;
   
value = (DWORD)ref;
  }
  ~
CS68DataCell() {}

 
// присвоение значения
 
template<typename T>
 
void operator=(T val)
  {
ModifyValue(val);}

 
void operator=(CS68DataCell &cell)
  {
memcpy(this, &cell, sizeof(CS68DataCell));}

 
// чтение значения
 
operator DWORD() const {return Value();}
};


//////////////////////////////////////////////
//////////////////////////////////////////////


void Test()
{
 
// Тест: создаём регистр D,
  // бьём на 2 половинки (A, B) и
  // выделяем третий справа бит в рег. B
 
CS68DataCell regD;
 
CS68DataCell regA(&regD, 0, 7);
 
CS68DataCell regB(&regD, 8, 15);
 
CS68DataCell regB_bit2(&regB, 2);
 
 
regD = 0x7f7f;
 
regA = 0x12;
 
regB = 0x34;
 
regB_bit2 = 0;
 
regB_bit2 = 1;
 
 
DWORD val;
 
val = regD;
 
val = regA; 
 
val = regB;
 
val = regB_bit2;
}



--------------------
user posted image
PM MAIL WWW   Вверх
mr.DUDA
Дата 24.4.2004, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Попутно вопрос: почему приходится переопределять оператор "=" в производных классах ? Если этого не делать, то компилятор ругается, что конструктор по умолчанию не определён. Например, этот код не компилится:
Цитата
// класс для именованных объектов
class CS68NamedObject
{
private:
 
CString  name;
public:
 
CS68NamedObject(CString str): name(str) {}
 
CString Name() const {return name;}
};


// проблемный участок кода
class CS68NamedBit: public CS68DataCell, public CS68NamedObject
{
public:
 
CS68NamedBit(CString name, CS68DataCell *ref, int iBit):
   
CS68DataCell(ref, iBit),
   
CS68NamedObject(name)
    {}

/*  void operator=(DWORD val)
  {ModifyValue(val);} */
};

// Если не раскомментировать оператор "=", то
// компилятор ругается:
// F:\PROGRAMMING\Sim68w\src\Sim68wDoc.cpp(48) : error C2679: binary '=' : no operator defined
//    which takes a right-hand operand of type 'const int' (or there is no acceptable conversion)
// F:\PROGRAMMING\Sim68w\src\Sim68wDoc.cpp(50) : error C2664: '=' : cannot convert parameter 1 from 'const int' to
//    'const class CS68NamedBit &'
//        Reason: cannot convert from 'const int' to 'const class CS68NamedBit'
//        No constructor could take the source type, or constructor overload resolution was ambiguous



// тестовая функция
void Test()
{
 
CS68DataCell cell;
 
CS68NamedBit bit("bit2", &cell, 2);
 
bit.operator =(1);
}



--------------------
user posted image
PM MAIL WWW   Вверх
cardinal
Дата 24.4.2004, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



Цитата
почему приходится переопределять оператор "=" в производных классах ?

Ничего точного сказать не могу, но может мои догадки тебе помогут.

1. Догадка:
Попробуй сначала только с одним классом наследовать:
Код
class CS68NamedBit: public CS68DataCell

Если прошло, то см. догадка 2. smile.gif

2. Догадка:
Код
class CS68NamedBit: public CS68DataCell, public CS68NamedObject

CS68NamedObject не имеет оператора = и может поэтому он и не defined. Попробуй поменять public CS68DataCell и public CS68NamedObject местами. Это тупо, согласен, но кто знает у какого класса какой приоритет.

3. Догадка (самая тупая наверно):
operator= не наследуется напрямую.


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
mr.DUDA
Дата 24.4.2004, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Первая догадка не подтвердилась hmmm.gif. Даже если наследовать только от CS68DataCell, всё равно приходится переопределять (заново определять ?) оператор "=".

Видимо, операторы действительно не наследуются напрямую.


--------------------
user posted image
PM MAIL WWW   Вверх
mr.DUDA
Дата 24.4.2004, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



З.Ы. "раскрашивалку" синтаксиса можно скачать тут:
http://forum.vingrad.ru/index.php?showtopi...ndpost&p=148310


--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0766 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.