У меня возникли сомнения: в своем проекте, который, должен возвращать по текущей позиции указателя на экране элемент, написал следующий код:
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] и т.п. для выделения фрагментов кода. -- ПК