Корректное и удобное использование указателей и ссылок.
От: Andreev  
Дата: 19.07.05 08:14
Оценка:
У меня возникли сомнения: в своем проекте, который, должен возвращать по текущей позиции указателя на экране элемент, написал следующий код:
enum EL_TYPES
{
  EL_NULL, EL_TEXT, EL_LABEL, EL_EDIT, EL_LIST
};

class CElement
{
public:
           CElement( void );
  void     init( void );
  EL_TYPES type( void ){ return el_type; };

  . . .

  int      x;
  int      y;
  int      width;

  . . .

protected:
  EL_TYPES el_type;
  char*    el_data;
};

class CScreen
{
public:
             CScreen( void ){ init(); };
  void       init( void );

  . . .

  CElement&  get_element( int x, int y )
  {
    //if ( x + length > owner->width() ) return false;
    for ( int i = 0; i < count(); i++ )
    {
      if ( elements[i]->y == y && elements[i]->x <= x && elements[i]->x + elements[i]->width > x ) return *elements[i];
    }
    return *((CElement*)NULL);
}

  CElement& operator [] ( int index )
  {
    if ( index == -1 ) return *((CElement*)NULL);
    else return *elements[index];
  };

  . . .

protected:
  char    name[64];
  std::vector<CElement*> elements;
};

????????????????????????
Вопрос сводится к вызову метода get_element и оператора [] в классе CScreen. Красиво ли будет выглядеть код:
????????????????????????
CScreen& s = get_current_screen();
CElement& e = s.get_element( m_caret_pos.x, m_caret_pos.y );
if ( &e && e.type() == EL_TEXT )
{
  . . .
}

или все-таки вместо ссылке здесь красивее было бы использовать указатель:
  CElement*  get_element( int x, int y )

соответственно:
CElement* e = s.get_element( m_caret_pos.x, m_caret_pos.y );
if ( e && e->type() == EL_TEXT )

!!!!!!!!!!!!!!!!!!!!!!!!
Почему я использовал ссылку – потому, что можно перегрузить оператор EL_TYPES:
!!!!!!!!!!!!!!!!!!!!!!!!
  operator EL_TYPES ( void ) { return type(); };

и, тогда:
if ( &e && e == EL_TEXT )
{
  . . .
}

, что мне кажется – очень удобным.

Спасибо за внимание.
Критикуйте. (-:
Не забывайте, пожалуйста, использовать теги [c]...[/c], [code]...[/code] и т.п. для выделения фрагментов кода. -- ПК
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.