Помогите решить проблему (class)
Модератор: Модераторы разделов
-
kkkggg
- Сообщения: 100
Помогите решить проблему
#include <iostream.h>
class Year
{
private:
int y;
public:
Year(int a) {y=a;}
operator int() {return *this;}
};
class Date
{
private:
int y;
public:
Date(Year yy) {y=yy;}
};
int main ()
{
Date(Year(4));
return 0;
}
Пишет "Ошибка сегментации", насколько я понимаю ошибка в конструкторе класса Date. Вопрос, как заставить конструктор класса Date принимать тип Year?
class Year
{
private:
int y;
public:
Year(int a) {y=a;}
operator int() {return *this;}
};
class Date
{
private:
int y;
public:
Date(Year yy) {y=yy;}
};
int main ()
{
Date(Year(4));
return 0;
}
Пишет "Ошибка сегментации", насколько я понимаю ошибка в конструкторе класса Date. Вопрос, как заставить конструктор класса Date принимать тип Year?
-
Shura
- Сообщения: 1537
- Статус: Оказывается и без KDE есть жизнь
- ОС: FreeBSD 8.0-RC2
Re: Помогите решить проблему
А если так?:
Код: Выделить всё
operator int() {return this;}Rock'n'roll мертв © БГ
-
v04bvs
- Сообщения: 636
- ОС: Debian GNU/Linux
Re: Помогите решить проблему
Забавно, ошибка то видна, надо писать
operator int() {return y;}
но, как оказалось, при варианте автора эта функция вызывается рекурсивно! Т.е. бесконечная рекурсия
Очень любопытная ошибка.
MSVS сказал "warning C4717: 'Year::operator int' : recursive on all control paths, function will cause runtime stack overflow", думаю, gcc тоже что нибудь подобное скажет с -Wall
operator int() {return y;}
но, как оказалось, при варианте автора эта функция вызывается рекурсивно! Т.е. бесконечная рекурсия
MSVS сказал "warning C4717: 'Year::operator int' : recursive on all control paths, function will cause runtime stack overflow", думаю, gcc тоже что нибудь подобное скажет с -Wall
-
Hvzh
- Сообщения: 711
- Статус: Gone with Linux
- ОС: Linux Mint 18.1
Re: Помогите решить проблему
Вообще-то нужно написать
class Date: public Year
{
...
}
class Date: public Year
{
...
}
HP 255 G4 A6-6310 + Linux Mint 18.1 + Windoze7 under VmWare + OS X Mavericks under VmWare
-
v04bvs
- Сообщения: 636
- ОС: Debian GNU/Linux
-
Hvzh
- Сообщения: 711
- Статус: Gone with Linux
- ОС: Linux Mint 18.1
Re: Помогите решить проблему
Да, согласен. Я был неправ. правильнее - operator int() {return y;}
HP 255 G4 A6-6310 + Linux Mint 18.1 + Windoze7 under VmWare + OS X Mavericks under VmWare
-
WiZ
- Сообщения: 60
Re: Помогите решить проблему
Ну еще бы там не было рекурсии... фактически выполняется такой код -
operator int() {return (int) *this; }
А зачем, если не секрет, писать "private:"?
Arch / Linux-ck 64bit / xmonad / vim,opera,deadbeef,zsh /
-
Ballantre
- Сообщения: 114
- ОС: Linux
Re: Помогите решить проблему
Позволю себе встрять со своим мнением: проще сделать inline-функцию:
inline int Year::GetY(){
return y;
}
Ну а там уже вызывать ее.
inline int Year::GetY(){
return y;
}
Ну а там уже вызывать ее.
Я двадцать лет знал его и всегда ненавидел, и всегда восхищался, и всегда по-рабски боялся его.
-
WiZ
- Сообщения: 60
Re: Помогите решить проблему
Afaik все функции реализованные внутри объявления класса автоматически становятся инлайновыми.
Arch / Linux-ck 64bit / xmonad / vim,opera,deadbeef,zsh /
-
Ballantre
- Сообщения: 114
- ОС: Linux
Re: Помогите решить проблему
Я в курсе. Но предпочитаю не реализовывать в определении класса, в отдельно и добавлять соответствующее ключевое слово. Так, для структуризации. Поэтому отдельно и указал.
Я двадцать лет знал его и всегда ненавидел, и всегда восхищался, и всегда по-рабски боялся его.
-
Hvzh
- Сообщения: 711
- Статус: Gone with Linux
- ОС: Linux Mint 18.1
Re: Помогите решить проблему
Ты в этом уверен?
HP 255 G4 A6-6310 + Linux Mint 18.1 + Windoze7 under VmWare + OS X Mavericks under VmWare
-
ety
- Сообщения: 358
- ОС: Linux
Re: Помогите решить проблему
по идее, если функция занимает два экрана и требует вынесения ее из заголовка, то под инлайн она явно не подпадает.
Образование - это вовсе не то, чему человека учили, а то, чему он научился.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
-
WiZ
- Сообщения: 60
Re: Помогите решить проблему
Да, по идее так должно быть, хотя все зависит от конкретной реализации компилятора. Но не надо забывать о том, что директива inline - это всего лишь рекомендация. Сложно сказать будет ли та или иная функция действительно подставляться в код.
Arch / Linux-ck 64bit / xmonad / vim,opera,deadbeef,zsh /
-
Hvzh
- Сообщения: 711
- Статус: Gone with Linux
- ОС: Linux Mint 18.1
Re: Помогите решить проблему
Не всегда это только рекомендация. Некоторые компайлеры, MSVC, например, при определенных оптимизационных стечениии обстоятельств делают функцию inline насильственно, так что потом долго думаешь по поводу неадекватной работы программы
HP 255 G4 A6-6310 + Linux Mint 18.1 + Windoze7 under VmWare + OS X Mavericks under VmWare
-
ety
- Сообщения: 358
- ОС: Linux
Re: Помогите решить проблему
простите, а что у вас за программа такая, основывающаяся на физических характеристиках функции?
имхо, некоторые на инлайнах шибко зацикливаются, отвлекаясь от главной проблемы, ведь это просто маленькая условность, которая и не нужна в конце концов, ибо компилятор и сам догадается заинлайнить все что нужно при O3. А те редкие time-critical участки по любому будут доводится до ума вручную на ассемблере (Сишка тут ну никак не поможет), посему не заметить странное поведение там будет сложно.
Образование - это вовсе не то, чему человека учили, а то, чему он научился.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
-
Hvzh
- Сообщения: 711
- Статус: Gone with Linux
- ОС: Linux Mint 18.1
Re: Помогите решить проблему
Сейчас уже и не помню, я на С++ уже года три не программлю, заколебало, да и не нужно из-за специфики работы
HP 255 G4 A6-6310 + Linux Mint 18.1 + Windoze7 under VmWare + OS X Mavericks under VmWare
-
Ballantre
- Сообщения: 114
- ОС: Linux
Re: Помогите решить проблему
Согласен, на inline не стоит циклиться, тем более, что потом из-за подобного объявления могут возникнуть траблы при вызове этой функции. Но и пренебрегать этим тоже не стоит. 
Я двадцать лет знал его и всегда ненавидел, и всегда восхищался, и всегда по-рабски боялся его.