Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.05.2011, 11:03   #1
AndreyBS
 
Регистрация: 17.04.2011
Сообщений: 9
По умолчанию перезагрузка статических операторов

Добрый день!

Есть ли возможность в VC++ перезагружать статические операторы (т.е. для базовых типов, вне класса)?

Пример:

class AnsiString{
private:
char *_data;
...
public:
operator char *() { return _data; }
AnsiString operator+ ( char *Str ){ AnsiString _ret = _data; _ret._append(Str); return _ret; }
...
};

Перезагружены операторы класса, позволяющие делать это:

AnsiString str1, str2;
char *ch = str1 + str2;

А хотелось бы делать это:

AnsiString str = "строка 1" + "строка 2";

Не существует преобразования (AnsiString) = (char *)+(char *)
По логике вещей нужно было бы перезагрузить статический оператор как то так:

AnsiString char:: operator+ (char *Str){ return AnsiString(this)+Str; }

но это не работает. Есть идеи, что нужно сделать?
AndreyBS вне форума Ответить с цитированием
Старый 12.05.2011, 11:39   #2
AndreyBS
 
Регистрация: 17.04.2011
Сообщений: 9
По умолчанию

И еще вопрос - как перезагрузить операцию (AnsiString *) = (char *):

AnsiString:: operator char *() { return _data; }
перезагружает (AnsiString) = (char *):
как описать то же самое для (AnsiString *)
AndreyBS вне форума Ответить с цитированием
Старый 12.05.2011, 11:40   #3
Hemul
Форумчанин
 
Регистрация: 03.10.2010
Сообщений: 321
По умолчанию

перегрузи оператор = и складывай strcat()
Hemul вне форума Ответить с цитированием
Старый 12.05.2011, 12:39   #4
AndreyBS
 
Регистрация: 17.04.2011
Сообщений: 9
По умолчанию

Цитата:
Сообщение от Hemul Посмотреть сообщение
перегрузи оператор = и складывай strcat()
Перезагрузить где? В AnsiString? Это позволяет делать

(AnsiString) = (char *).

Я же спрашиваю про

(AnsiString) = (char *) + (char *)

Это разбивается на:

(char *) = (char *) + (char *); // НЕ СРАБОТАЕТ!!!
(AnsiString) = (char *);

А должно быть

(AnsiString) = (char *) + (char *);
(AnsiString) = (AnsiString);

Как это сделать, я не понял...
AndreyBS вне форума Ответить с цитированием
Старый 12.05.2011, 12:41   #5
Hemul
Форумчанин
 
Регистрация: 03.10.2010
Сообщений: 321
По умолчанию

(AnsiString) = strcat(char*,char*)
Hemul вне форума Ответить с цитированием
Старый 12.05.2011, 13:06   #6
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Не перезагрузить, а перегрузить. Нельзя определять поведение операторов для базовых типов, только для пользовательских (классы, структуры). Придётся писать так:
Код:
const char* str_1 = "string 1";
const char* str_2 = "string 2";
AnsiString astr = AnsiString(str_1) + str_2;
netrino вне форума Ответить с цитированием
Старый 12.05.2011, 13:22   #7
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

моно попробывать сделать так:
перегрузить operator+(AnsiStr a, AnsiStr b) {...}
и чтобы в AnsiStr был конструктор AnsiStr(char*) , тогда будут вызываться конструкторы a и b .
onewho вне форума Ответить с цитированием
Старый 12.05.2011, 13:50   #8
AndreyBS
 
Регистрация: 17.04.2011
Сообщений: 9
По умолчанию

Цитата:
Сообщение от Hemul Посмотреть сообщение
(AnsiString) = strcat(char*,char*)
Это не спортивно, хочу через "+"
AndreyBS вне форума Ответить с цитированием
Старый 12.05.2011, 13:52   #9
AndreyBS
 
Регистрация: 17.04.2011
Сообщений: 9
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Не перезагрузить, а перегрузить. Нельзя определять поведение операторов для базовых типов, только для пользовательских (классы, структуры). Придётся писать так:
Код:
const char* str_1 = "string 1";
const char* str_2 = "string 2";
AnsiString astr = AnsiString(str_1) + str_2;
Матрица - перезагрузка. Косяк...

По поводу
AnsiString(str_1) + str_2;
сейчас так и делаю. Не очень красиво. Я подумал, может как то обойти можно.
AndreyBS вне форума Ответить с цитированием
Старый 12.05.2011, 14:00   #10
AndreyBS
 
Регистрация: 17.04.2011
Сообщений: 9
По умолчанию

Цитата:
Сообщение от onewho Посмотреть сообщение
моно попробывать сделать так:
перегрузить operator+(AnsiStr a, AnsiStr b) {...}
и чтобы в AnsiStr был конструктор AnsiStr(char*) , тогда будут вызываться конструкторы a и b .
Есть такой конструктор. Но это ничего не дает. Нужно, чтобы (char *)+(char *) воспринималось как (AnsiString)+(char *), но для этого нужно преобразовать (char *) в (AnsiString), не используя методы AnsiString. Т.е. нужно перегружать char, но такое невозможно - так написали выше...
AndreyBS вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сортировка статических структур mego4el Помощь студентам 1 22.02.2011 23:17
с++ инициализация статических елементов класса p_alex Помощь студентам 5 25.10.2009 16:52
Перезагрузка операторов Maxim_Burea Помощь студентам 5 23.09.2009 15:30
Перезагрузка операторов в C++ (помогите плиз) 3s3e3r3e3g3a3 Фриланс 7 22.09.2009 21:51
Перегрузка операторов, Организация перегрузки операторов chagin_yav Помощь студентам 2 12.05.2008 09:15