Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.08.11;
Скачать: CL | DM;

Вниз

Опять проблема в Си, только странная...   Найти похожие ветки 

 
VEG ©   (2003-07-25 22:12) [0]

Имеются классы:
class icfg {
public:
icfg ( string sGroup, string sParam, int iDefault );
icfg& operator = (const int val);
operator int() const;
private:
int& liValue;
};
class scfgidx {
public:
scfgidx ( string sGrp, string sPar, string sDef, uint iLen=3, uint iForm=10 );
string& operator [] (const int idx) const;
private:
icfg iCount; //Переменная предыдущего класса
string sGroup;
string sParam;
string sDefault;
uint iIdxLen;
uint iIdxFormat;
};
scfgidx::scfgidx ( string sGrp, string sPar, string sDef, uint iLen,uint iForm ):
iCount( sGrp, sPar, 0 )
{
sGroup = sGrp;
sParam = sPar;
sDefault = sDef;
iIdxLen = iLen;
iIdxFormat = iForm;
}

string& scfgidx::operator [] (const int idx) const
{
if( iCount < idx )
iCount = idx; // Почему-то выдает ошибку: [C++ Error] Config.cpp(64): E2285 Could not find a match for "icfg::operator =(int)"
/* // Если использую переменную этого класса, созданную в этом коде, то все ок!
icfg iCnt ( sGroup, sParam, 0 );
if( iCnt < idx )
iCnt = idx; // В этом случае тут проходит...
*/
return Config.GetLnk( sGroup, sParam+ItoS( idx, iIdxLen, iIdxFormat ), sDefault );
}

В чем проблема?


 
VEG ©   (2003-07-25 22:36) [1]

Если таким же образом обращаюсь к переменной из scfgidx::scfgidx ( string sGrp, string sPar, string sDef, uint iLen,uint iForm ), то все работает. Что это значит?


 
Suntechnic ©   (2003-07-25 22:42) [2]

>VEG ©
Ну ты молодец. Объявил перегруженный оператор, как константную ф-цию string& operator [] (const int idx) const;, а потом удивляешь чего это она вдруг переменную класса поменять не может.


И ещё... Что возвращает Config.GetLnk? Я так полагаю, что переменную типа string? Если string, тогда этот код в высшей стпепени некорректен. Если ссылку на string, то всё равно выглядит как-то подозрительно :)


 
VEG ©   (2003-07-25 22:45) [3]

>Suntechnic
Спасибо!
GetLnk - название говорит само за себя - взять ссылку:)


 
VEG ©   (2003-07-26 17:48) [4]

Но вот нашел у себя высшей степени некорректнось:) Функция должна возвращать ссылку на string. Я полагаю, что return str будет некорректным решением. Как правильно?


 
Suntechnic ©   (2003-07-26 18:47) [5]

>VEG © (26.07.03 17:48)
Как правильно?

Я не знаю как правильно, потому, что я не знаю что тебе нужно... но зато я знаю как не правильно. Грубейшая ошибка в данном случае пытаться вернуть ссылку на автоматическую переменную типа string. Автоматическая переменная будет уничтожена при выходе из области видимости т.е. по окончании работы ф-цци, возвращая ссылку на эту переменную ты возвращаешь ссылку на не существующий объект.


 
VEG ©   (2003-07-26 18:56) [6]

Значит у меня правильно: тот string, на который я передаю ссылку, существует на протяжении работы всей программы.



Страницы: 1 вся ветка

Текущий архив: 2003.08.11;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.017 c
14-33343
AlexRush
2003-07-24 18:28
2003.08.11
Ставим на работе новую винду, и вдруг она


6-33249
drnet
2003-06-06 03:58
2003.08.11
TWebBrowser не отрабатывает OnBeforeNavigate под XP


3-33082
xBocT
2003-07-17 15:18
2003.08.11
Ошибочка при работе с AdoDataSet


3-33066
steelpunk
2003-07-17 17:10
2003.08.11
В DbGrid вместо русских букв диез(#)


7-33374
Lamerr
2003-05-28 11:50
2003.08.11
Аналог паскалевской port.