Страница 1 из 1

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

Добавлено: 2008-08-18 22:33:28
CooP
Мне трудно было представить, что я когда-нибудь буду материть разработчиков компилятора с++ под 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.

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

Добавлено: 2008-08-20 9:55:43
zingel

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

gdb -tui
уже не рулит? =)

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

Добавлено: 2008-08-20 16:35:14
hizel
все шелковисто

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

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:

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

Добавлено: 2008-08-20 19:10:11
CooP
Hizel, вы правы, в моём примере должно быть

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

double D = oA;
, так было в моей программе, просто писал по памяти. Причина, думаю, быдет в отсутствии у меня в программе (и в примере) звёздочки (перед оА). Эта моя вечная проблема с указателями - путаница в голове, где нужна звёздочка, где не нужна, где нужно две звёздочки, а где и вообще &.
Hizel, большое спасибо, правильно сделал, что спросил, ибо до звёздочки не додумался бы, и в голове не было.

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

Добавлено: 2008-08-20 20:24:12
hizel
ну и ладненько :)