Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.96.159] |
|
Сообщ.
#1
,
|
|
|
CSString::CSString():str(NULL),Allocate(0)
{ *this=""; } CStr& CStr::operator = (const char* _str) { DWORD _strLen=strlen(_str); if(Allocate<=_strLen) { if(str!=NULL) delete[] str; str=new char[_strLen+1]; Allocate=_strLen+1; } memcpy(str,_str,Length+1); //^^^^^^^^^^^^^ Exception. Acces volution. //хотя str[0]=_str[0]; -- всё хокей. SetLen(); return *this; } //Ну там ещё много всяких проверок, но вот в этом куске у меня ошибка. // Понимаю что ДНК не изменишь... main() { CStr str; //Валимся.... } |
Сообщ.
#2
,
|
|
|
A-a-a-a-a-a-a-a-a-a!!!!!!!!!
Убейте месагу!!! Как меня закоротило! Пол часа бился над этим эксцепшином!!! А ведь надо было просто memcpy(str,_str,Length+1); Length ведь ещё не проинициализирован! А-а-а! purpe, убей мой экаунт вообще -- я это заслужил. |
Сообщ.
#3
,
|
|
|
зря ты так, это ведь очень частая ошибка, ничего страшного если программисты лишний раз намотают себе на ус
|
Сообщ.
#4
,
|
|
|
"A-a-a-a-a-a-a-a-a-a!!!!!!!!!
Убейте месагу!!! Как меня закоротило! Пол часа бился над этим эксцепшином!!! А ведь надо было просто memcpy(str,_str,Length+1); Length ведь ещё не проинициализирован!" Все правильно. Как раз об этом я тебе и написал. Но когда нажал кнопочку "Ответить" у меня сеть повисла...Тама еще одна (во всяком случае для меня) непонятность. Конструкция *this="";. Смутно представляется чего хочется, но луше так пустой объект не инициить, поскоку в конструкторе ишшо нет указателя на этот объект (во всяком случае так считается). Посему тоже чревато появлением глупого совета "....Обратитесь к разработчику", видите ли... |
Сообщ.
#5
,
|
|
|
Согласен Vovochka. Убери нафиг из конструктора присваивание и вынеси инициализацию переменных в отдельный метод, например Init. К тому же, если ты рассчитываешь таким образом проинициализировать и производный классы, то у тебя ничего не получится - в конструкторе vtable не определена.
|
Сообщ.
#6
,
|
|
|
Упс... Сенкс.
|
Сообщ.
#7
,
|
|
|
Ну вот и ладушки...
С Новым Годом! |
Сообщ.
#8
,
|
|
|
2server_mouse:
ну, уж лучше так: CSString::CSString():str(NULL),Allocate(0) :CString("") { } 2Vovochka: в предыдущем стандарте действительно указатель this == 0 в конструторе, если объект создавался в куче, но уже в драфте существующего стандарта такое поведение изменили, он указывает на базовый класс, кстати именно из-за этого нельзя вызывать виртуальные функции в конструкторе, отработают функции базового класса, не дай Бог чисто виртуальные . |
Сообщ.
#9
,
|
|
|
2Valery
И дальше так: ??? CSString::CSString(char* buf) { this*=""; } )) Шутка. Я понял. |
Сообщ.
#10
,
|
|
|
Бог мой, с какого перепоя я мог такой бред написать? И с чего это я вдруг в конструкторе this на базовый класс тыкнул?
Перепутал с vtbl. Всем, кого я мог ввести в заблуждение этим - сорри. |
Сообщ.
#11
,
|
|
|
vtbl при этом, конечно тоже не на базовый класс указывает, ну, вы поняли... ))
|
Сообщ.
#12
,
|
|
|
"он указывает на базовый класс..." Так ведь Новый Год, однако...
|
Сообщ.
#13
,
|
|
|
блин, я ж сам свой угарный бред поправил, чего ради еще раз носом тыкать?
|