Перегрузка операторов и конструирование объекта через new

Модератор: Fastman

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
CooP
рядовой
Сообщения: 35
Зарегистрирован: 2008-06-17 11:13:11
Откуда: Беларусь

Перегрузка операторов и конструирование объекта через new

Непрочитанное сообщение CooP » 2008-08-18 22:33:28

Мне трудно было представить, что я когда-нибудь буду материть разработчиков компилятора с++ под FreeBSD, но после 3 часов мыкания по САБЖу это было.
Хочется узнать, прав я или нет. Суть вопроса я тоже не мог себе преставить, но создались предпосылки для перегрузки оператора [] для моего класса (не зря же мозги сушил на эту тему). Эта перегрузка никак не хотела работать, и я упростил её до преобразования типа класса, который тоже не работает при конструировании обьекта класса при помощи new. Вот упрощённый пример:

Код: Выделить всё

Class A {
 double d;
public:
 A(double D):d(D) {}
 operator double() { return d;}
};
Где-то в программе:

Код: Выделить всё

oA* = new A(1.2);
double D = A;
Этот упрощённый пример, практически переписанный из книги, не работает, компилятор ругается - пишет, что неверное преобразование типа. Это начинает работать, если написать так.
Где-то в программе:

Код: Выделить всё

A oA(1.2);
double D = A;
Так вот мне очень интересно, почему сиё не хочет работать при выделении памяти для объекта через new. В этом есть какой-то специальный смысл, или это что-то типа бага компилятора? Надо проверить это на Visual Studio, или какой там компилятор можно считать эталонным? Может найдётся человек, понимающий изнанку с++...
Интересно также, если это баг, то кому и как на него жаловаться?
На всякий случай: FreeBSD 7.0, компилятор стандартный, файлы кода имеют расширение cpp, компилирую так: c++ -o bin pr1.cpp pr2.cpp... с присоединением нужных библиотек через -l.
Duron 900, 256Mb, TT S-1401, FreeBSD 7.0, ttbudget, skyfish; @HeliosNet at 53°
--> Торможу полным ходом -->

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
zingel
beastie
Сообщения: 6204
Зарегистрирован: 2007-10-30 3:56:49
Откуда: Moscow
Контактная информация:

Re: Перегрузка операторов и конструирование объекта через new

Непрочитанное сообщение zingel » 2008-08-20 9:55:43

Код: Выделить всё

gdb -tui
уже не рулит? =)
Z301171463546 - можно пожертвовать мне денег

Аватара пользователя
hizel
дядя поня
Сообщения: 9031
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: Перегрузка операторов и конструирование объекта через new

Непрочитанное сообщение hizel » 2008-08-20 16:35:14

все шелковисто

Код: Выделить всё

class A {
        double d;
        public:
        A(double D):d(D) {}
        operator double() { return d;}
};

int main(int argc, char *argv[]){
        A a(1.2);
        double D = a;
        A* b = new A(1.2);
        D = *b;
}
кстати компилятор с++ во FreeBSD из состава gcc который в свою очередь входит в состав так или иначе всех открытых осей,
альтернативы на текущий момент нет

Код: Выделить всё

double D = A;
в этой строчке что то у вас явно не так с пониманием, вы определяете переменную и приравниваете его к типу, это как? :shock:
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

Аватара пользователя
CooP
рядовой
Сообщения: 35
Зарегистрирован: 2008-06-17 11:13:11
Откуда: Беларусь

Re: Перегрузка операторов и конструирование объекта через new

Непрочитанное сообщение CooP » 2008-08-20 19:10:11

Hizel, вы правы, в моём примере должно быть

Код: Выделить всё

double D = oA;
, так было в моей программе, просто писал по памяти. Причина, думаю, быдет в отсутствии у меня в программе (и в примере) звёздочки (перед оА). Эта моя вечная проблема с указателями - путаница в голове, где нужна звёздочка, где не нужна, где нужно две звёздочки, а где и вообще &.
Hizel, большое спасибо, правильно сделал, что спросил, ибо до звёздочки не додумался бы, и в голове не было.
Duron 900, 256Mb, TT S-1401, FreeBSD 7.0, ttbudget, skyfish; @HeliosNet at 53°
--> Торможу полным ходом -->

Аватара пользователя
hizel
дядя поня
Сообщения: 9031
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: Перегрузка операторов и конструирование объекта через new

Непрочитанное сообщение hizel » 2008-08-20 20:24:12

ну и ладненько :)
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.