LINUX.ORG.RU

C++: перегрузка присваивания указателей


0

0

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

class cl {...};

cl *operator= (cl* (&a), cl* (&b))
{
    b->number_links++;
    return a=b;
};

Может быть можно что-нибудь сделать?
★★★★★

ну и как эта фиговина поведет себя если я напишу a=a+1??

> Может быть можно что-нибудь сделать?

предобработка кода..

dilmah ★★★★★
()

Только обернуть этый указатель другим классом, имхо.

С уважением -- Смоляное Чучелко

anonymous
()
Ответ на: комментарий от dilmah

> ну и как эта фиговина поведет себя если я напишу a=a+1??
Довольно жестоко :-)
К адресу a прибавиться единица, затем посчитается что по этому адресу записан класс cl и там к number_links прибавиться единица :-)

unDEFER ★★★★★
() автор топика
Ответ на: комментарий от anonymous

> Только обернуть этый указатель другим классом, имхо.

Да, скорее всего вы правы, но я пожалуй тогда лучше переборю своё желание перегрузить этот оператор и обзову это функцией copy() :-)

unDEFER ★★★★★
() автор топика
Ответ на: комментарий от unDEFER

ИМХО правильно. Помоему перезагрузка операторов это лишнее и делает программу менее понятной и запутанной хотя и более читабельной. ее надо применять только в самых крайних случаях опятьже ИМХО.

x86 ★★
()
Ответ на: комментарий от unDEFER

> > ну и как эта фиговина поведет себя если я напишу a=a+1??

> Довольно жестоко :-)

ты слишком буквально понял..
Допустим есть:

cl arr[10];
cl *p;

Тогда запись p = arr + 10 абсолютно законна, более того такое часто встречается
в циклах и т.п. Дальше объяснять?

А еще, забыл добавить -- C++ какашка.

dilmah ★★★★★
()
Ответ на: комментарий от x86

ИМНО неправильно. Напр операторы << >> для ввода вывода - мне вот оч. нравяиться и оч читабельно:-)

Перегрузка операторов - вещь оч.эффективная, если конечно пользоваться ей разумно (не переопределять + на - и т.д.:-)) В частности, обертывание указателя в класс (желат. темплэйтный, т.н. "умные указатели") в С++ является типовым приемом для решения различных задач (напр. авт. сборки мусора в самом примитивном исполнении). Ничего сложного тут нету, занимает строчек десять если память не изменяет...

AIv ★★★★★
()
Ответ на: комментарий от dilmah

> более того такое часто встречается в циклах и т.п.
Само собой - сам использую ;-)
Но запись a=a+1 всё же жестока, если конечно это не 'char *a'
Вот a=a+sizeof(a) - совсем другое дело

unDEFER ★★★★★
() автор топика
Ответ на: комментарий от unDEFER

> Но запись a=a+1 всё же жестока, если конечно это не 'char *a' Вот a=a+sizeof(*a) - совсем другое дело

йопте-нате. Ты в школе адресную арифметику проходил??:)

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

Чё, я всё-таки ошибся? Мдя.. простой пример показывает.. в самом деле:

int a[]={1,2,3,4,5,6,7,8,9,10,0};
int *p=a;
while (*p) printf ("%d\n", *(p++));

Ну, да ладно :-) Я просто как-то над этим не задумывался.. Хотя даже сталкивался и писал.. без sizeof. Но чаще я всё-таки с (char*) измывался..
А в школе у нас, увы, кроме бейсика ничего не было (да и то, так сказать устно - компов мы не видали), сами понимаете какая в бейсике адресная арифметика :-)

unDEFER ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.