Возможна ли перегрузка оператора = в виде отдельной функции
От: navrocky  
Дата: 14.08.09 07:06
Оценка:
Есть классы A и B. Хочу определить отдельный оператор присваивания:

A operator= (B b)


Компилятор ругается и говорит что этот оператор должен быть не статическим членом класса. Хотя когда-то мне встречалась такая возможность определить оператор отдельно. Полистал книжку страуструпа, так и не понял, можно ли это сделать.

Помогите с синтаксисом
Re: Возможна ли перегрузка оператора = в виде отдельной функ
От: Bell Россия  
Дата: 14.08.09 07:17
Оценка:
Здравствуйте, 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: Возможна ли перегрузка оператора = в виде отдельной функ
От: Мишень-сан  
Дата: 14.08.09 07:18
Оценка:
Здравствуйте, navrocky, Вы писали:

N>Есть классы A и B. Хочу определить отдельный оператор присваивания:


N>
N>A operator= (B b)
N>


N>Компилятор ругается и говорит что этот оператор должен быть не статическим членом класса. Хотя когда-то мне встречалась такая возможность определить оператор отдельно. Полистал книжку страуструпа, так и не понял, можно ли это сделать.


N>Помогите с синтаксисом


Оператор = одно из исключений, он не может быть перегружен в виде внешней функции, только как метод класса.
Re: Возможна ли перегрузка оператора = в виде отдельной функ
От: Vlad_SP  
Дата: 14.08.09 07:19
Оценка:
Здравствуйте, navrocky, Вы писали:

N>... так и не понял, можно ли это сделать.


Нельзя. Основание: Стандарт, 13.5.3. An assignment operator shall be implemented by a non-static member function with exactly one parameter.
Re: Возможна ли перегрузка оператора = в виде отдельной функ
От: jazzer Россия Skype: enerjazzer
Дата: 14.08.09 07:32
Оценка:
Здравствуйте, 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.

jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: Возможна ли перегрузка оператора = в виде отдельной ф
От: navrocky  
Дата: 14.08.09 07:42
Оценка:
Здравствуйте, Bell, Вы писали:

B>Какая именно требуется функциональность?


Мне надо определить специфичную операцию присваивания класса A классу B, и при этом не хочется в класс А тащить зависимости на класс B. Например:

myclass c;
std::string str;

str = c;


Может переопределить оператор преобразования типа? его можно отдельно от класса прописать?
Re[3]: Возможна ли перегрузка оператора = в виде отдельной ф
От: Bell Россия  
Дата: 14.08.09 08:01
Оценка:
Здравствуйте, 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  
Дата: 14.08.09 08:14
Оценка:
Здравствуйте, Bell, Вы писали:

B>Ничего не понял. Если объекту типа B нужно присвоить объект типа A, то каким боком A должен зависеть от B?


Ошибся, наоборот.

B>Именно в таком виде ничего не выйдет.

B>Нет, нельзя.

Тоесть получается мне остается только писать функции?:
B A_to_B(A);
A B_to_A(B);


Через равно никак?
Re[5]: Возможна ли перегрузка оператора = в виде отдельной ф
От: Bell Россия  
Дата: 14.08.09 08:18
Оценка:
Здравствуйте, navrocky, Вы писали:

N>Тоесть получается мне остается только писать функции?:

N>
N>B A_to_B(A);
N>A B_to_A(B);
N>


N>Через равно никак?

В данной постановке — никак.
Любите книгу — источник знаний (с) М.Горький
Re[6]: Возможна ли перегрузка оператора = в виде отдельной ф
От: navrocky  
Дата: 14.08.09 08:42
Оценка:
Здравствуйте, Bell, Вы писали:

N>>Через равно никак?

B>В данной постановке — никак.

Эх

Получилось переопределить оператор <<
myclass& operator << (myclass& cl, std::string& str);


видимо буду его вместо равно использовать.

Но вот не пойму, зачем понавводили этих тупых ограничений
Re[6]: Возможна ли перегрузка оператора = в виде отдельной ф
От: navrocky  
Дата: 14.08.09 09:39
Оценка:
Здравствуйте, Bell, Вы писали:

N>>Через равно никак?

B>В данной постановке — никак.

А в какой постановке можно через равно?
Re[5]: Возможна ли перегрузка оператора = в виде отдельной ф
От: Кодт Россия  
Дата: 14.08.09 09:49
Оценка:
Здравствуйте, 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_cast
struct 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>>
http://files.rsdn.org/4783/catsmiley.gif Перекуём баги на фичи!
Re[5]: Возможна ли перегрузка оператора = в виде отдельной ф
От: . Великобритания  
Дата: 14.08.09 10:51
Оценка:
navrocky wrote:

> Тоесть получается мне остается только писать функции?:


 
> B A_to_B(A);
> A B_to_A(B);

> Через равно никак?
Я не совсем понял что тут чему присваивается? По идее нужно что-то типа
B A_to_B(B target, A source);
A B_to_A(A target, B source);

?
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[6]: Возможна ли перегрузка оператора = в виде отдельной ф
От: navrocky  
Дата: 14.08.09 11:52
Оценка:
Здравствуйте, ., Вы писали:

.>Я не совсем понял что тут чему присваивается? По идее нужно что-то типа

.>
.>B A_to_B(B target, A source);
.>A B_to_A(A target, B source);
.>

.>?

можно это и так было написать... но от этого не легче. Мне хотелось заменить эту кучу функций на оператор присвоения.
Re[7]: Возможна ли перегрузка оператора = в виде отдельной ф
От: Programador  
Дата: 14.08.09 12:22
Оценка:
Здравствуйте, navrocky, Вы писали:


N>можно это и так было написать... но от этого не легче. Мне хотелось заменить эту кучу функций на оператор присвоения.


незя. Както так можно
template <class T>
struct Tmp
 {  T& that;
    Tmp(T& t):that(t){}
    template <class C> operator C();
 };
template <class I>
 Tmp<I> convert(I& i)
 { return Tmp<I>(i);
 }


template <>
 Tmp<int>::operator double ()
 {  return that*2;
 }

int main(int argc, char **argv)
{  int a=9;
   double d=convert(a);
Re[3]: Возможна ли перегрузка оператора = в виде отдельной ф
От: d.4 Россия  
Дата: 17.08.09 12:20
Оценка:
Здравствуйте, navrocky, Вы писали:

N>Здравствуйте, Bell, Вы писали:


B>>Какая именно требуется функциональность?


N>Мне надо определить специфичную операцию присваивания класса A классу B, и при этом не хочется в класс А тащить зависимости на класс B. Например:


N>
N>myclass c;
N>std::string str;

N>str = c;
N>


N>Может переопределить оператор преобразования типа? его можно отдельно от класса прописать?


Вам поможет оператор приведения.

#include <string>

class myclass
{
public:
    operator std::string () const
    {
        return "your text here";
    }
};

void test()
{
    std::string str;
    myclass c;
    str = c;
}


Проверено на MS Visual C++ 6, Visual C++ 2008, Borland C++ 5.5, G++.
Re: Возможна ли перегрузка оператора = в виде отдельной функ
От: Vain Россия google.ru
Дата: 17.08.09 13:01
Оценка:
Здравствуйте, 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]: Возможна ли перегрузка оператора = в виде отдельной ф
От: MasterZiv СССР  
Дата: 17.08.09 16:59
Оценка:
navrocky пишет:

> Но вот не пойму, зачем понавводили этих тупых ограничений


Видишь ли, семантика присваивания -- очень важный аспект
функционирования класса. Её нельзя отдавать из класса наружу,
для её возможного переопределения. Если же ты пишешь отдельно
стоящую функцию, и она не будет работать -- это уже твои
личные проблемы.
Posted via RSDN NNTP Server 2.1 beta
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.