Есть классы A и B. Хочу определить отдельный оператор присваивания:
A operator= (B b)
Компилятор ругается и говорит что этот оператор должен быть не статическим членом класса. Хотя когда-то мне встречалась такая возможность определить оператор отдельно. Полистал книжку страуструпа, так и не понял, можно ли это сделать.
Помогите с синтаксисом
Re: Возможна ли перегрузка оператора = в виде отдельной функ
Здравствуйте, navrocky, Вы писали:
N>Есть классы A и B. Хочу определить отдельный оператор присваивания:
N>
N>A operator= (B b)
N>
N>Компилятор ругается и говорит что этот оператор должен быть не статическим членом класса. Хотя когда-то мне встречалась такая возможность определить оператор отдельно. Полистал книжку страуструпа, так и не понял, можно ли это сделать.
Нельзя так сделать. Из твоего примера вообще не ясно, что чему должно присваиваться.
13.5.3/1
An assignment operator shall be implemented by a non-static member function with exactly one parameter.
...
Какая именно требуется функциональность?
Любите книгу — источник знаний (с) М.Горький
Re: Возможна ли перегрузка оператора = в виде отдельной функ
Здравствуйте, navrocky, Вы писали:
N>Есть классы A и B. Хочу определить отдельный оператор присваивания:
N>
N>A operator= (B b)
N>
N>Компилятор ругается и говорит что этот оператор должен быть не статическим членом класса. Хотя когда-то мне встречалась такая возможность определить оператор отдельно. Полистал книжку страуструпа, так и не понял, можно ли это сделать.
N>Помогите с синтаксисом
Оператор = одно из исключений, он не может быть перегружен в виде внешней функции, только как метод класса.
Re: Возможна ли перегрузка оператора = в виде отдельной функ
Здравствуйте, navrocky, Вы писали:
N>Есть классы A и B. Хочу определить отдельный оператор присваивания:
N>
N>A operator= (B b)
N>
N>Компилятор ругается и говорит что этот оператор должен быть не статическим членом класса. Хотя когда-то мне встречалась такая возможность определить оператор отдельно. Полистал книжку страуструпа, так и не понял, можно ли это сделать.
N>Помогите с синтаксисом
13.5.3
An assignment operator shall be implemented by a non-static member function with exactly one parameter.
Здравствуйте, navrocky, Вы писали:
B>>Какая именно требуется функциональность?
N>Мне надо определить специфичную операцию присваивания класса A классу B, и при этом не хочется в класс А тащить зависимости на класс B. Например:
Ничего не понял. Если объекту типа B нужно присвоить объект типа A, то каким боком A должен зависеть от B?
N>
N>myclass c;
N>std::string str;
N>str = c;
N>
Именно в таком виде ничего не выйдет.
N>Может переопределить оператор преобразования типа? его можно отдельно от класса прописать?
Нет, нельзя.
Любите книгу — источник знаний (с) М.Горький
Re[4]: Возможна ли перегрузка оператора = в виде отдельной ф
Здравствуйте, navrocky, Вы писали:
N>Тоесть получается мне остается только писать функции?: N>
N>B A_to_B(A);
N>A B_to_A(B);
N>
N>Через равно никак?
Напрямую — никак.
Кроме того, лексема "=" перегружена: это и оператор присваивания, и участник стейтмента инициализации. Оба действия близки и по виду, и по смыслу, но радикально отличаются с точки зрения компилятора.
Поэтому единственная дорога — это определение приведения типов: или со стороны "откуда" (operator куда() const), или со стороны "куда" (конструктор куда(откуда const&)).
Вариант с перегрузкой любого другого оператора (например, <<=) в роли присваивания не создаёт возможность инициализировать.
Однако, можно прибегнуть к посреднику — имитации static_cast'а.
// пусть у нас есть семейство перегруженных функций
A make_a(const B&);
A make_a(const C&);
// посредник - для засахаривания вызова функции в static_caststruct to_a
{
A m_a;
to_a(const A& t) : m_a(t) {}
template<class T> to_a(const T& t) : m_a(make_a(t)) {}
operator A const&() const { return m_a; }
};
B b;
C c;
A a1 = (to_a) b; // здесь c-style cast, сводящийся к static_cast B --> to_a, а затем неявный static_cast to_a --> A
A a2 = (to_a) c;
// абсолютно то же самое
A a3 = static_cast<to_a>(b); // по-прежнему следом за явным B --> to_a идёт неявный to_a --> A
// без сахара и промежуточных объектов
A a4 = make_a(b);
Посредник ещё удобен тем, что он может совершать дополнительные действия: вести лог, выполнять валидацию, и т.д. и т.п.
Выше приведён минимальный каркас посредника, хотя, если попрыгать-поплясать, можно сделать универсальный всемогутер.
Скажем, вот так
template<class Traits>
struct convertor
{
typedef typename Traits::result_type result_type;
result_type m_t;
template<class T> convertor(const T& t) : m_t(Traits::convert(t)) {}
operator result_type const&() const { return m_t; }
};
struct convert_to_a
{
typedef A result_type;
static A const& convert(A const& t) { return t; }
// мало ли, как мы захотим обрабатывать тождественное преобразование?
// поэтому оно тоже отдаётся на откуп трейтсуtemplate<class T> static A convert(T const& t) { return ::make_a(t); }
// здесь используем внешние функции (перегруженные как угодно)
// хотя можно и внутри класса определить всё необходимое
};
typedef convertor<convert_to_a> to_a;
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[5]: Возможна ли перегрузка оператора = в виде отдельной ф
Здравствуйте, navrocky, Вы писали:
N>Здравствуйте, Bell, Вы писали:
B>>Какая именно требуется функциональность?
N>Мне надо определить специфичную операцию присваивания класса A классу B, и при этом не хочется в класс А тащить зависимости на класс B. Например:
N>
N>myclass c;
N>std::string str;
N>str = c;
N>
N>Может переопределить оператор преобразования типа? его можно отдельно от класса прописать?
Здравствуйте, navrocky, Вы писали:
N>Есть классы A и B. Хочу определить отдельный оператор присваивания: N>
N>A operator= (B b)
N>
N>Компилятор ругается и говорит что этот оператор должен быть не статическим членом класса. Хотя когда-то мне встречалась такая возможность определить оператор отдельно. Полистал книжку страуструпа, так и не понял, можно ли это сделать. N>Помогите с синтаксисом
Что тебе не даёт определить оператор в классе?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[7]: Возможна ли перегрузка оператора = в виде отдельной ф
navrocky пишет:
> Но вот не пойму, зачем понавводили этих тупых ограничений
Видишь ли, семантика присваивания -- очень важный аспект
функционирования класса. Её нельзя отдавать из класса наружу,
для её возможного переопределения. Если же ты пишешь отдельно
стоящую функцию, и она не будет работать -- это уже твои
личные проблемы.