забыл как переопределить оператор. например Код (Text): class Cx { private: int m_x; public: Cx() { m_x = 1; } }; int operator = (Cx arg) { return arg.m_x; } как-то так. но в то же время функция int operator = (Cx arg) должна быть дружественной. когда объявляю её дружественной - вылетает ошибка "operator=" must be a member function. как правильно сделать?
язык требует, чтобы операторы присваивания ("="), взятия индекса ("[]"), вызова ("()") и доступа к членам по стрелке ("->") были определены как члены класса. В противном случае выдается сообщение об ошибке компиляции.
А что вообще нужно сделать? Чтобы объекты авто-кастились в инт? Чтобы объект мог присваивать себе инт? Или чтобы при присвоении получалась неведомая беспорядочность (один саботирует какой-то проект? ? Код (Text): class Cx { public: int operator= (const Cx& arg) const { return arg.m_x; } }; ^Неведомая беспорядочность. Код (Text): class Cx { public: Cx& operator= (int arg) { m_x = arg; return *this; } }; ^Присвоение инт. Код (Text): class Cx { public: operator int() const { return m_x; } }; ^Авто-каст в инт.
Sol_Ksacap нетрудно догадаться что каст. уже глянул как в атл. думал через переопределение оператора тоже можно. ошибался.
почему? в программе я пишу что-то типа Код (Text): Cx x; int a = x; мне нужно действие оператора. обратное преобразование ведь выполняется именно через переопределение оператора, т.е. Код (Text): int a = 0; Cx x; x = a;
cupuyc Потому что нужно определить оператор конвертирования, а не присваивания. Конвертор тоже может быть только функцией членом.
Ustus >которым является любой конструктор с одним параметром, не объявленный explicit. Ну объяви у int конструктор, мы посмотрим. Или думаешь я не в курсе, что может неявно вызываться конструктор? ^)
Booster Вообще-то я имел ввиду приведение int -> свой тип. Ибо Это ведь не я сказал? Короче, щас тут все запутаются, особенно ТС. Дано: пользовательский тип Cx. Требуется: взаимное (неявное) преобразование Cx <-> int, так чтобы Cx можно было использовать везде, где допускается int и наоборот. Найти: минимальный набор функций для этого необходимых. Решение: Код (Text): class Cx { public: Cx(int x = 1) : m_x(x) {} operator int() const { return m_x; } private: int m_x; }; Замечание: переопределение конструктор копирования и оператор присваивания в общем случае не требуются. Таковые нужны только если класс имеет нетривиальную семантику копирования, что в данном случае не наблюдается. Следовательно в данном случае можно положится на определенные по умолчанию реализации.
Ustus Я это могу повторить сколько угодно раз, так как присваивание и конструирование это разные вещи и каст через присваивание абсолютно не укладывается в моей голове.
Код (Text): class Cx { private: int m_x; public: Cx() {} ~Cx() {} Cx& operator = (int x) { m_x = x; return *this; } }; уложился?
Booster А я разве спорю? Я просто предположил, что именно на самом деле было нужно. cupuyc Просмотри еще раз мой пост. С большой вероятностью это именно то, чего ты хочешь добиться.
попробовал бы воспользоваться своим кодом, понял бы что говорит Booster. // нельзя, конвертирующий конструктор не определен, а именно он и нужен Cx x = 0; // можно Cx x; // мусор x = 0; Правильно определить Cx(int const&); // для POD можно как в №10 Cx x(0); // Ok Cx xx = 0; // Ok