Помогите решить проблему (class)

Модератор: Модераторы разделов

Аватара пользователя
kkkggg
Сообщения: 100

Помогите решить проблему

Сообщение kkkggg »

#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?
Спасибо сказали:
Аватара пользователя
Shura
Сообщения: 1537
Статус: Оказывается и без KDE есть жизнь
ОС: FreeBSD 8.0-RC2

Re: Помогите решить проблему

Сообщение Shura »

А если так?:

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

operator int() {return this;}
Rock'n'roll мертв © БГ
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Помогите решить проблему

Сообщение v04bvs »

Забавно, ошибка то видна, надо писать
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: Помогите решить проблему

Сообщение Hvzh »

Вообще-то нужно написать

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

Re: Помогите решить проблему

Сообщение v04bvs »

Hvzh писал(а):
10.10.2006 15:34
Вообще-то нужно написать

class Date: public Year
{
...
}

Почему это? Вы хотите сказать "Дата это год". Это неправильно. Автор делает агрегирование, совершенно верный подход. По крайней мере мне так кажется.

PS правда он делает это неправильно, но сути это не меняет.
Спасибо сказали:
Аватара пользователя
Hvzh
Сообщения: 711
Статус: Gone with Linux
ОС: Linux Mint 18.1

Re: Помогите решить проблему

Сообщение Hvzh »

v04bvs писал(а):
10.10.2006 15:58
Hvzh писал(а):
10.10.2006 15:34

Вообще-то нужно написать

class Date: public Year
{
...
}

Почему это? Вы хотите сказать "Дата это год". Это неправильно. Автор делает агрегирование, совершенно верный подход. По крайней мере мне так кажется.

PS правда он делает это неправильно, но сути это не меняет.


Да, согласен. Я был неправ. правильнее - operator int() {return y;}
HP 255 G4 A6-6310 + Linux Mint 18.1 + Windoze7 under VmWare + OS X Mavericks under VmWare
Спасибо сказали:
WiZ
Сообщения: 60

Re: Помогите решить проблему

Сообщение WiZ »

v04bvs писал(а):
10.10.2006 15:18
но, как оказалось, при варианте автора эта функция вызывается рекурсивно! Т.е. бесконечная рекурсия :) Очень любопытная ошибка.
Ну еще бы там не было рекурсии... фактически выполняется такой код -
operator int() {return (int) *this; }

А зачем, если не секрет, писать "private:"?
Arch / Linux-ck 64bit / xmonad / vim,opera,deadbeef,zsh /
Спасибо сказали:
Аватара пользователя
Ballantre
Сообщения: 114
ОС: Linux

Re: Помогите решить проблему

Сообщение Ballantre »

Позволю себе встрять со своим мнением: проще сделать inline-функцию:
inline int Year::GetY(){
return y;
}
Ну а там уже вызывать ее.
Я двадцать лет знал его и всегда ненавидел, и всегда восхищался, и всегда по-рабски боялся его.
Спасибо сказали:
WiZ
Сообщения: 60

Re: Помогите решить проблему

Сообщение WiZ »

Ballantre писал(а):
10.10.2006 21:42
Позволю себе встрять со своим мнением: проще сделать inline-функцию:
inline int Year::GetY(){
return y;
}
Ну а там уже вызывать ее.

Afaik все функции реализованные внутри объявления класса автоматически становятся инлайновыми.
Arch / Linux-ck 64bit / xmonad / vim,opera,deadbeef,zsh /
Спасибо сказали:
Аватара пользователя
Ballantre
Сообщения: 114
ОС: Linux

Re: Помогите решить проблему

Сообщение Ballantre »

Я в курсе. Но предпочитаю не реализовывать в определении класса, в отдельно и добавлять соответствующее ключевое слово. Так, для структуризации. Поэтому отдельно и указал.
Я двадцать лет знал его и всегда ненавидел, и всегда восхищался, и всегда по-рабски боялся его.
Спасибо сказали:
Аватара пользователя
Hvzh
Сообщения: 711
Статус: Gone with Linux
ОС: Linux Mint 18.1

Re: Помогите решить проблему

Сообщение Hvzh »

WiZ писал(а):
10.10.2006 21:55
Afaik все функции реализованные внутри объявления класса автоматически становятся инлайновыми.

Ты в этом уверен?
HP 255 G4 A6-6310 + Linux Mint 18.1 + Windoze7 under VmWare + OS X Mavericks under VmWare
Спасибо сказали:
Аватара пользователя
ety
Сообщения: 358
ОС: Linux

Re: Помогите решить проблему

Сообщение ety »

Ballantre писал(а):
10.10.2006 22:43
Я в курсе. Но предпочитаю не реализовывать в определении класса, в отдельно и добавлять соответствующее ключевое слово. Так, для структуризации. Поэтому отдельно и указал.

по идее, если функция занимает два экрана и требует вынесения ее из заголовка, то под инлайн она явно не подпадает.
Образование - это вовсе не то, чему человека учили, а то, чему он научился.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
Спасибо сказали:
WiZ
Сообщения: 60

Re: Помогите решить проблему

Сообщение WiZ »

Hvzh писал(а):
11.10.2006 10:26
Ты в этом уверен?
Да, по идее так должно быть, хотя все зависит от конкретной реализации компилятора. Но не надо забывать о том, что директива inline - это всего лишь рекомендация. Сложно сказать будет ли та или иная функция действительно подставляться в код.
Arch / Linux-ck 64bit / xmonad / vim,opera,deadbeef,zsh /
Спасибо сказали:
Аватара пользователя
Hvzh
Сообщения: 711
Статус: Gone with Linux
ОС: Linux Mint 18.1

Re: Помогите решить проблему

Сообщение Hvzh »

WiZ писал(а):
11.10.2006 13:18
Hvzh писал(а):
11.10.2006 10:26

Ты в этом уверен?
Да, по идее так должно быть, хотя все зависит от конкретной реализации компилятора. Но не надо забывать о том, что директива inline - это всего лишь рекомендация. Сложно сказать будет ли та или иная функция действительно подставляться в код.

Не всегда это только рекомендация. Некоторые компайлеры, MSVC, например, при определенных оптимизационных стечениии обстоятельств делают функцию inline насильственно, так что потом долго думаешь по поводу неадекватной работы программы
HP 255 G4 A6-6310 + Linux Mint 18.1 + Windoze7 under VmWare + OS X Mavericks under VmWare
Спасибо сказали:
Аватара пользователя
ety
Сообщения: 358
ОС: Linux

Re: Помогите решить проблему

Сообщение ety »

Hvzh писал(а):
11.10.2006 13:35
Некоторые компайлеры, MSVC, например, при определенных оптимизационных стечениии обстоятельств делают функцию inline насильственно, так что потом долго думаешь по поводу неадекватной работы программы

простите, а что у вас за программа такая, основывающаяся на физических характеристиках функции?

имхо, некоторые на инлайнах шибко зацикливаются, отвлекаясь от главной проблемы, ведь это просто маленькая условность, которая и не нужна в конце концов, ибо компилятор и сам догадается заинлайнить все что нужно при O3. А те редкие time-critical участки по любому будут доводится до ума вручную на ассемблере (Сишка тут ну никак не поможет), посему не заметить странное поведение там будет сложно.
Образование - это вовсе не то, чему человека учили, а то, чему он научился.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
Спасибо сказали:
Аватара пользователя
Hvzh
Сообщения: 711
Статус: Gone with Linux
ОС: Linux Mint 18.1

Re: Помогите решить проблему

Сообщение Hvzh »

ety писал(а):
11.10.2006 14:11
простите, а что у вас за программа такая, основывающаяся на физических характеристиках функции?

Сейчас уже и не помню, я на С++ уже года три не программлю, заколебало, да и не нужно из-за специфики работы
HP 255 G4 A6-6310 + Linux Mint 18.1 + Windoze7 under VmWare + OS X Mavericks under VmWare
Спасибо сказали:
Аватара пользователя
Ballantre
Сообщения: 114
ОС: Linux

Re: Помогите решить проблему

Сообщение Ballantre »

Согласен, на inline не стоит циклиться, тем более, что потом из-за подобного объявления могут возникнуть траблы при вызове этой функции. Но и пренебрегать этим тоже не стоит. :D
Я двадцать лет знал его и всегда ненавидел, и всегда восхищался, и всегда по-рабски боялся его.
Спасибо сказали: