С++ для начинающих



         

Конвертеры - часть 2


operator int( SmallInt & );  // ошибка: не член

class SmallInt {

public:

   int operator int();       // ошибка: задан тип возвращаемого значения

   operator int( int = 0 );  // ошибка: задан список параметров

   // ...

};

Конвертер вызывается в результате явного преобразования типов. Если преобразуемое значение имеет тип класса, у которого есть конвертер, и в операции приведения указан тип этого конвертера, то он и вызывается:

#include "Token.h"

Token tok( "function", 78 );

// функциональная нотация: вызывается Token::operator SmallInt()

SmallInt tokVal = SmallInt( tok );

// static_cast: вызывается Token::operator tName()

char *tokName = static_cast< char * >( tok );

У конвертера Token::operator tName() может быть нежелательный побочный эффект. Попытка прямого обращения к закрытому члену Token::name помечается компилятором как ошибка:

char *tokName = tok.name;  // ошибка: Token::name - закрытый член

Однако наш конвертер, разрешая пользователям непосредственно изменять Token::name, делает как раз то, от чего мы хотели защититься. Скорее всего, это не годится. Вот, например, как могла бы произойти такая модификация:

#include "Token.h"

Token tok( "function", 78 );

char *tokName = tok;   // правильно: неявное преобразование

*tokname = 'P';  // но теперь в члене name находится Punction!

Мы намереваемся разрешить доступ к преобразованному объекту класса Token только для чтения. Следовательно, конвертер должен возвращать тип const char*:

typedef const char *cchar;

class Token {

public:

   operator cchar() { return name; }

   // ...

};

// ошибка: преобразование char* в const char* не допускается

char *pn = tok;

const char *pn2 = tok;   // правильно

Другое решение – заменить в определении Token тип char* на тип string из стандартной библиотеки C++:

class Token {

public:

   Token( string, int );

   operator SmallInt() { return val; }

   operator string()   { return name; }




Содержание  Назад  Вперед