Не вызывается конструктор
От: Molchalnik  
Дата: 14.07.11 16:47
Оценка:
Платформа — C++builder 6

задаю в .h файле класс, объявляю в том же файле через extern глобальную переменную, экземпляр этого класса.

в .cpp файле дублирую объявление переменной уже без extern.

проблема в том, что конструктор класса вообще не вызывается.

при обращении к функциям класса программа валится по причине неинициализированности класса. есть два конструктора, с параметрами и без, пробовал оба, не выходит(((

если же создавать через new, то всё нормально. конструктор нормально вызывается.

что делать???

почему???
Re: Не вызывается конструктор
От: Vamp Россия  
Дата: 14.07.11 17:00
Оценка: +1
M>проблема в том, что конструктор класса вообще не вызывается.
А сам cpp файл не забыл скопилировать и прилинковать?
Да здравствует мыло душистое и веревка пушистая.
Re[2]: Не вызывается конструктор
От: Molchalnik  
Дата: 14.07.11 17:37
Оценка:
Здравствуйте, Vamp, Вы писали:

M>>проблема в том, что конструктор класса вообще не вызывается.

V>А сам cpp файл не забыл скопилировать и прилинковать?
конечно! и в проект спп файл добавлен, и специально его отдельно перекомпилировал
Re[3]: Не вызывается конструктор
От: Erop Россия  
Дата: 14.07.11 17:43
Оценка:
Здравствуйте, Molchalnik, Вы писали:

M>конечно! и в проект спп файл добавлен, и специально его отдельно перекомпилировал


А что в том cpp есть кроме этого объекта?
Напиши .map файл и посмотри, остаётся ли вообще у тебя конструктор в программе.
Может быть так, что раз в единице трансляции нет используемого кода, то линкер выбрасывает и саму единицу и её инициализацию...

Попробуй, например, определение твоей глобальной переменной перенести в единицу трансляции, в которой определён main. И посмотри что будет.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: Не вызывается конструктор
От: Vamp Россия  
Дата: 14.07.11 17:43
Оценка: 1 (1)
M>конечно! и в проект спп файл добавлен, и специально его отдельно перекомпилировал
Тогда следующий вопрос — а не пытаешься ли ты обратиться к этому объекту из другого статического (глобального) объекта в другом файле? Тогда ты наткнулся на то, что порядок инициализации статических объектов в разных единицах трансляции не определен.
Да здравствует мыло душистое и веревка пушистая.
Re[4]: Не вызывается конструктор
От: Molchalnik  
Дата: 14.07.11 18:11
Оценка:
Здравствуйте, Vamp, Вы писали:

M>>конечно! и в проект спп файл добавлен, и специально его отдельно перекомпилировал

V>Тогда следующий вопрос — а не пытаешься ли ты обратиться к этому объекту из другого статического (глобального) объекта в другом файле? Тогда ты наткнулся на то, что порядок инициализации статических объектов в разных единицах трансляции не определен.

обращение идёт из кнопки на форме, а билдеровские и дельфийские формы создаются только динамически, в мэйне, это требование библиотеки VCL
Re[4]: Не вызывается конструктор
От: Molchalnik  
Дата: 14.07.11 18:16
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, Molchalnik, Вы писали:


M>>конечно! и в проект спп файл добавлен, и специально его отдельно перекомпилировал


E>А что в том cpp есть кроме этого объекта?

E>Напиши .map файл и посмотри, остаётся ли вообще у тебя конструктор в программе.
E>Может быть так, что раз в единице трансляции нет используемого кода, то линкер выбрасывает и саму единицу и её инициализацию...

Единицу не выбрасывает, но точки останова на копирующем конструкторе и конструкторе по умолчанию выделены как неактивные. верный признак того, что эти функции компилятор выкинул из конечного кода, посчитав невызываемыми.

E>Попробуй, например, определение твоей глобальной переменной перенести в единицу трансляции, в которой определён main. И посмотри что будет.


попробовал.
unresolved external в файле .h будет. где определение с external.

естественно, этот .h файл я заранее подключил к файлу с main, до определения переменной.
Re[5]: Не вызывается конструктор
От: Erop Россия  
Дата: 14.07.11 18:31
Оценка:
Здравствуйте, Molchalnik, Вы писали:

M>попробовал.

M>unresolved external в файле .h будет. где определение с external.

Не совсем понятно. То есть собираемость программы у тебя зависит от того, в какой именно единице трансляции лежит определение?

А не мог бы ты привести строчку с объявлением и строчку с определением своей переменной?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: Не вызывается конструктор
От: Molchalnik  
Дата: 14.07.11 19:00
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, Molchalnik, Вы писали:


M>>попробовал.

M>>unresolved external в файле .h будет. где определение с external.

E>Не совсем понятно. То есть собираемость программы у тебя зависит от того, в какой именно единице трансляции лежит определение?


E>А не мог бы ты привести строчку с объявлением и строчку с определением своей переменной?


определение:
ANNdebuglogC __debuglog("c:\\dbg.txt");

объявление:
ANNdebuglogC __debuglog("c:\\dbg.txt");

Собственно, это отладочный лог, я его не впервый раз использую, и всегда всё работало. более того, и в этом проекте работало. отключился после небольшой переработки кода.
Re[7]: Не вызывается конструктор
От: Molchalnik  
Дата: 14.07.11 19:01
Оценка:
сорри, опечатался

M>определение:

M>ANNdebuglogC __debuglog("c:\\dbg.txt");

M>объявление:

extern ANNdebuglogC dbglog;
Re[8]: Не вызывается конструктор
От: VladFein США  
Дата: 14.07.11 19:13
Оценка:
Здравствуйте, Molchalnik, Вы писали:

M>сорри, опечатался


M>>определение:

M>>ANNdebuglogC __debuglog("c:\\dbg.txt");

M>>объявление:

M>extern ANNdebuglogC dbglog;

Ещё одна опечатка? Знаки подчёркивания в __debuglog есть или нет?
По-моему, это зарезервированно для нужд компилятора...
Re[9]: Не вызывается конструктор
От: Molchalnik  
Дата: 14.07.11 19:23
Оценка:
Здравствуйте, VladFein, Вы писали:

VF>Здравствуйте, Molchalnik, Вы писали:


M>>сорри, опечатался


M>>>определение:

M>>>ANNdebuglogC __debuglog("c:\\dbg.txt");

M>>>объявление:

M>>extern ANNdebuglogC dbglog;

VF>Ещё одна опечатка?


объявление:


extern ANNdebuglogC __debuglog;
extern ANNdebuglogC dbglog;

определение:


ANNdebuglogC dbglog;
ANNdebuglogC __debuglog("c:\\dbg.txt");

просто тестирую два конструктора сразу — по умолчанию и с названием файла

Знаки подчёркивания в __debuglog есть или нет?
да, есть

VF>По-моему, это зарезервированно для нужд компилятора...


сколько раз использовал — работало нормально, но можно попробовать переименовать.

P.S. переименовал, не помогло
Re[7]: Не вызывается конструктор
От: VladFein США  
Дата: 14.07.11 19:37
Оценка:
Здравствуйте, Molchalnik, Вы писали:

M>Собственно, это отладочный лог, я его не впервый раз использую, и всегда всё работало. более того, и в этом проекте работало. отключился после небольшой переработки кода.


Тогда надо смотреть что было "переработано".
Если я делаю всё по Вашим описаниям, всё работает ОК.
(Конечно, не Борланд )
Re[7]: Не вызывается конструктор
От: Erop Россия  
Дата: 14.07.11 20:13
Оценка:
Здравствуйте, Molchalnik, Вы писали:

M>определение:

M>ANNdebuglogC __debuglog("c:\\dbg.txt");

M>объявление:

M>ANNdebuglogC __debuglog("c:\\dbg.txt");

1) А что такое ANNdebuglogC? Имя класса или какой-то typedef?
2) __debuglog -- это ваше имя переменной или какая-то билдеровская штучка? А то двойное подчёркивание в начале нехорошо.
3) Я так и не нашёл отличий между определением и объявлением...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[8]: Не вызывается конструктор
От: Erop Россия  
Дата: 14.07.11 20:17
Оценка:
Здравствуйте, Molchalnik, Вы писали:

M>сорри, опечатался


M>>определение:

M>>ANNdebuglogC __debuglog("c:\\dbg.txt");

M>>объявление:

M>extern ANNdebuglogC dbglog;

А тогда не ясна связь dbglog и __debuglog
Кто-то из них макрос?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[10]: Не вызывается конструктор
От: Erop Россия  
Дата: 14.07.11 20:22
Оценка:
Здравствуйте, Molchalnik, Вы писали:

M>просто тестирую два конструктора сразу — по умолчанию и с названием файла


Я тебе советую не запутывать ситуацию, а распутывать.
Тестируй что-нибудь одно. Например, вариант с именем файла...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Не вызывается конструктор
От: Erop Россия  
Дата: 14.07.11 20:29
Оценка:
Здравствуйте, Molchalnik, Вы писали:

M>если же создавать через new, то всё нормально. конструктор нормально вызывается.

M>что делать???
M>почему???

Есть такое предложение. В хедере пишешь:
ANNdebuglogC& dbglog();
а в cpp пишешь:
static ANNdebuglogC log( "тут, то, что тебе тут надо написать" );
ANNdebuglogC& dbglog() { return log; }

Ставишь точку останова в dbglog() и смотришь откуда она зовётся, такая красивая, что конструктор ещё не позвался.

Или само поправится, или отладишься, или синглетон Майерса прикрутишь...
Типа такого:
ANNdebuglogC& dbglog()
{
    static ANNdebuglogC log(" ... " );
    return log;
}
static ANNdebuglogC& garantee = dbglog(); // гарантируем создание до функции main()


То, что это лог, наводит таки на мысли, что запись происходит откуда-то не оттуда, откуда надо

Второй вариант -- ты нечаянно сломал что-то в проекте и теперь просто из рантайма не вызывается точка входа, отвечаюзая за создание статических объектов...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Не вызывается конструктор
От: Ligen Украина http://zone-of-ambiguity.blogspot.com/
Дата: 14.07.11 20:53
Оценка: +1
Здравствуйте, Molchalnik, Вы писали:

M>Платформа — C++builder 6


M>проблема в том, что конструктор класса вообще не вызывается.

M>при обращении к функциям класса программа валится по причине неинициализированности класса. есть два конструктора, с параметрами и без, пробовал оба, не выходит(((
off: объекта, а не класса

M>если же создавать через new, то всё нормально. конструктор нормально вызывается.

M>почему???
широкоизвестный глюк борландовского компилятора. например, похожая тема

M>что делать???

сменить компилер
Viva el Junta Militar! Viva el Presidente!
Re: похоже на глюк
От: Wissenschaftler http://rsdn_user.livejournal.com
Дата: 14.07.11 21:00
Оценка:
Здравствуйте, Molchalnik, Вы писали:

если приспичило сидеть на борланде, можно конструктор руками дергать из main(). синтаксис гуглится.
Запретное обсуждение модерирования RSDN:
http://rsdn-user.livejournal.com/652.html
Re[8]: Не вызывается конструктор
От: Molchalnik  
Дата: 14.07.11 22:45
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, Molchalnik, Вы писали:



E>1) А что такое ANNdebuglogC? Имя класса или какой-то typedef?

ANNdebuglogC — это мой класс, который создаёт файл лога и пишет в него, а так же сохраняет бэкап-копии лога

E>2) __debuglog -- это ваше имя переменной или какая-то билдеровская штучка?


__debuglog — экземпляр класса ANNdebuglogC

E>А то двойное подчёркивание в начале нехорошо.

уже убрал. а почему нехорошо?

E>3) Я так и не нашёл отличий между определением и объявлением...

там, если другие мои ответы почитать, исправлено на это:


объявление:


extern ANNdebuglogC __debuglog;
extern ANNdebuglogC dbglog;

определение:


ANNdebuglogC dbglog;
ANNdebuglogC __debuglog("c:\\dbg.txt");
Re[2]: Не вызывается конструктор
От: Molchalnik  
Дата: 14.07.11 22:52
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, Molchalnik, Вы писали:


M>>если же создавать через new, то всё нормально. конструктор нормально вызывается.

M>>что делать???
M>>почему???

E>Есть такое предложение. В хедере пишешь:
ANNdebuglogC& dbglog();
E>
а в cpp пишешь:
static ANNdebuglogC log( "тут, то, что тебе тут надо написать" );
E>ANNdebuglogC& dbglog() { return log; }

E>Ставишь точку останова в dbglog() и смотришь откуда она зовётся, такая красивая, что конструктор ещё не позвался.

E>Или само поправится, или отладишься, или синглетон Майерса прикрутишь...

E>Типа такого:
ANNdebuglogC& dbglog()
E>{
E>    static ANNdebuglogC log(" ... " );
E>    return log;
E>}
E>static ANNdebuglogC& garantee = dbglog(); // гарантируем создание до функции main()


E>То, что это лог, наводит таки на мысли, что запись происходит откуда-то не оттуда, откуда надо


E>Второй вариант -- ты нечаянно сломал что-то в проекте и теперь просто из рантайма не вызывается точка входа, отвечаюзая за создание статических объектов...


спасибо!!!

Я вроде исправил.

там была такая штука, что я раньше брал свой "стандартный" лог — класс и переделывал его под нужды проекта.
Теперь я решил Сделать_Всё_По_Уму (ТМ) и наследовать переделанный под нужды проекта лог от стандартного. при этом стандартный лог в отдельном файле, лог_под_этот_проект — в другом модуле. все хедеры правильно подключены.

ну так вот, если наследовать класс, определённый в другом файле, то борланд компилер по каким-то причинам глючит. А если перенести всё водин файл, вроде работать начинает. точнее завтра скажу, когда потестю немного эту идею.
Re[2]: Не вызывается конструктор
От: Molchalnik  
Дата: 14.07.11 22:54
Оценка:
M>>что делать???
L>сменить компилер

Честно говоря, mfc после vcl кажется каменным веком и хочется руки кое-кому оборвать за такую либу...

визуал студия начинает втыкать, когда программишь на сишарпе, на си++ я от неё удовольствия не получил, ибо не мазохист.
Re[3]: Не вызывается конструктор
От: Erop Россия  
Дата: 15.07.11 03:13
Оценка:
Здравствуйте, Molchalnik, Вы писали:

M>спасибо!!!

Для "спасибо" тут есть кнопки

M>Я вроде исправил.

Поздравляю.

M>там была такая штука, что я раньше брал свой "стандартный" лог — класс и переделывал его под нужды проекта.

M>Теперь я решил Сделать_Всё_По_Уму (ТМ) и наследовать переделанный под нужды проекта лог от стандартного. при этом стандартный лог в отдельном файле, лог_под_этот_проект — в другом модуле. все хедеры правильно подключены.

M>ну так вот, если наследовать класс, определённый в другом файле, то борланд компилер по каким-то причинам глючит. А если перенести всё водин файл, вроде работать начинает. точнее завтра скажу, когда потестю немного эту идею.


Лучше всё-таки разобраться чего ему не хватает. Скорее всего дело не в наследовании, а в чём-то другом.
Я конкретно про билдер не в курсе, зато в курсе про много других "немного странных" компиляторов.
Часто бывает так, что компиляторы кладут код inline-методов не во все объектники, а только в каки-то конкретные. Например в тот, в котором описан какой-нибудь конкретный конструктор, или просто какой-нибудь из конструкторов/деструкторов. Так что вполне может быть так, что у твоей базы какая-то такая эвристика работает, а у наследника нет.


Кстати, "совсем по уму" можно ещё и агрегировать то, что у тебя база.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[9]: Не вызывается конструктор
От: Erop Россия  
Дата: 15.07.11 03:22
Оценка:
Здравствуйте, Molchalnik, Вы писали:

E>>А то двойное подчёркивание в начале нехорошо.

M>уже убрал. а почему нехорошо?

По стандарту. Такие имена зарезервированы для всяких расширений языка и внутренних нужд компилятора.

E>>3) Я так и не нашёл отличий между определением и объявлением...

M>там, если другие мои ответы почитать, исправлено на это:
Ну тут особенность движка такая, что можно получать сообщения не в виде дерева, а в виде ответов на твои и нтересующие тебя. Так что если в нескольких подветках общаешься, то многим участникам сильно не сразу всё становится видно.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: Не вызывается конструктор
От: Ligen Украина http://zone-of-ambiguity.blogspot.com/
Дата: 15.07.11 08:58
Оценка:
Здравствуйте, Molchalnik, Вы писали:

M>>>что делать???

L>>сменить компилер

M>Честно говоря, mfc после vcl кажется каменным веком и хочется руки кое-кому оборвать за такую либу...

это поначалу. потом привыкаешь, появляются наработки и даже начинает нравиться

но не mfc единым. например, в мире есть еще qt, более дружественная к бывшим борландистам
Viva el Junta Militar! Viva el Presidente!
Re[3]: Не вызывается конструктор
От: VladFein США  
Дата: 15.07.11 13:19
Оценка:
Здравствуйте, Molchalnik, Вы писали:

M>Честно говоря, mfc после vcl кажется каменным веком и хочется руки кое-кому оборвать за такую либу...


Плохому танцору...
Re[4]: Не вызывается конструктор
От: Molchalnik  
Дата: 16.07.11 23:34
Оценка:
Здравствуйте, VladFein, Вы писали:

VF>Здравствуйте, Molchalnik, Вы писали:


M>>Честно говоря, mfc после vcl кажется каменным веком и хочется руки кое-кому оборвать за такую либу...


VF>Плохому танцору...


Не передёргивайте. Мне ничего не мешает. Я могу и на mfc станцевать. Хороший мастер и кривым молотком сможет шуруп ввинтить. Просто очень интересно и весело слушать мнения в защиту завинчивания шурупов кривыми молотками...
Re: Не вызывается конструктор
От: Molchalnik  
Дата: 16.07.11 23:41
Оценка:
Здравствуйте, Ligen, Вы писали:

L>Здравствуйте, Molchalnik, Вы писали:


M>>>>что делать???

L>>>сменить компилер

M>>Честно говоря, mfc после vcl кажется каменным веком и хочется руки кое-кому оборвать за такую либу...

L>это поначалу. потом привыкаешь, появляются наработки и даже начинает нравиться

А оно всегда так — сначала больно, потом привыкаешь, потом начинает нравится. Этот процесс называется "мазохизм".

L>это поначалу. потом привыкаешь, появляются наработки и даже начинает нравиться


правильно, это такой особый подход от майкрософт — для использования их библиотеки нужно написать свою, которая их библиотеку доводит до ума

L>но не mfc единым. например, в мире есть еще qt, более дружественная к бывшим борландистам


Хотя ничего против qt я не имею, но он настолько отдельная и специфическая песня, что лучше её в суе не вспоминать...
Re[2]: Не вызывается конструктор
От: wander  
Дата: 18.07.11 04:36
Оценка:
Здравствуйте, Molchalnik, Вы писали:

M>Хотя ничего против qt я не имею, но он настолько отдельная и специфическая песня, что лучше её в суе не вспоминать...


Справедливости ради стоит заметить, что VCL тоже та еще песня и тоже весьма специфическая. Одна начинка чего стоит

И да, я тоже ничего против VCL не имею.
Re[2]: Не вызывается конструктор
От: Tonal- Россия www.promsoft.ru
Дата: 19.07.11 06:47
Оценка:
Здравствуйте, Ligen, Вы писали:

M>>Платформа — C++builder 6

M>>если же создавать через new, то всё нормально. конструктор нормально вызывается.
L>широкоизвестный глюк борландовского компилятора. например, похожая тема
Причём застарелый и развесистый.
Я ещё на borland 5.0, последнем добилдеровском их компилере с похожим боролся. Даже в их трекер как-то запостил.
А то, что он по разному проявляется в разных версиях указывает по ходу на какую-то структурную ошибку дизайна...

M>>что делать???

L>сменить компилер
Для дебилдера 6 — выход один — не использовать объекты сложныех классов как глобальные/статические.
Вместо них использовать синглетоны создающиеся при первом обращении или в main-е.
Ну и проверить на более новых версиях — может само рассосалось.

Ну и по поводу сменить компилер — правильный выход.
Тот же MinGW порождает более быстрый код. Да и подобных багов в нём куда меньше.
Ну и VCL на Qt — привыкаешь быстро, а плюсов — море.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.