задаю в .h файле класс, объявляю в том же файле через extern глобальную переменную, экземпляр этого класса.
в .cpp файле дублирую объявление переменной уже без extern.
проблема в том, что конструктор класса вообще не вызывается.
при обращении к функциям класса программа валится по причине неинициализированности класса. есть два конструктора, с параметрами и без, пробовал оба, не выходит(((
если же создавать через new, то всё нормально. конструктор нормально вызывается.
Здравствуйте, Vamp, Вы писали:
M>>проблема в том, что конструктор класса вообще не вызывается. V>А сам cpp файл не забыл скопилировать и прилинковать?
конечно! и в проект спп файл добавлен, и специально его отдельно перекомпилировал
Здравствуйте, Molchalnik, Вы писали:
M>конечно! и в проект спп файл добавлен, и специально его отдельно перекомпилировал
А что в том cpp есть кроме этого объекта?
Напиши .map файл и посмотри, остаётся ли вообще у тебя конструктор в программе.
Может быть так, что раз в единице трансляции нет используемого кода, то линкер выбрасывает и саму единицу и её инициализацию...
Попробуй, например, определение твоей глобальной переменной перенести в единицу трансляции, в которой определён main. И посмотри что будет.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
M>конечно! и в проект спп файл добавлен, и специально его отдельно перекомпилировал
Тогда следующий вопрос — а не пытаешься ли ты обратиться к этому объекту из другого статического (глобального) объекта в другом файле? Тогда ты наткнулся на то, что порядок инициализации статических объектов в разных единицах трансляции не определен.
Здравствуйте, Vamp, Вы писали:
M>>конечно! и в проект спп файл добавлен, и специально его отдельно перекомпилировал V>Тогда следующий вопрос — а не пытаешься ли ты обратиться к этому объекту из другого статического (глобального) объекта в другом файле? Тогда ты наткнулся на то, что порядок инициализации статических объектов в разных единицах трансляции не определен.
обращение идёт из кнопки на форме, а билдеровские и дельфийские формы создаются только динамически, в мэйне, это требование библиотеки VCL
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, Molchalnik, Вы писали:
M>>конечно! и в проект спп файл добавлен, и специально его отдельно перекомпилировал
E>А что в том cpp есть кроме этого объекта? E>Напиши .map файл и посмотри, остаётся ли вообще у тебя конструктор в программе. E>Может быть так, что раз в единице трансляции нет используемого кода, то линкер выбрасывает и саму единицу и её инициализацию...
Единицу не выбрасывает, но точки останова на копирующем конструкторе и конструкторе по умолчанию выделены как неактивные. верный признак того, что эти функции компилятор выкинул из конечного кода, посчитав невызываемыми.
E>Попробуй, например, определение твоей глобальной переменной перенести в единицу трансляции, в которой определён main. И посмотри что будет.
попробовал.
unresolved external в файле .h будет. где определение с external.
естественно, этот .h файл я заранее подключил к файлу с main, до определения переменной.
Здравствуйте, Molchalnik, Вы писали:
M>попробовал. M>unresolved external в файле .h будет. где определение с external.
Не совсем понятно. То есть собираемость программы у тебя зависит от того, в какой именно единице трансляции лежит определение?
А не мог бы ты привести строчку с объявлением и строчку с определением своей переменной?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, Molchalnik, Вы писали:
M>>попробовал. M>>unresolved external в файле .h будет. где определение с external.
E>Не совсем понятно. То есть собираемость программы у тебя зависит от того, в какой именно единице трансляции лежит определение?
E>А не мог бы ты привести строчку с объявлением и строчку с определением своей переменной?
Собственно, это отладочный лог, я его не впервый раз использую, и всегда всё работало. более того, и в этом проекте работало. отключился после небольшой переработки кода.
Здравствуйте, Molchalnik, Вы писали:
M>Собственно, это отладочный лог, я его не впервый раз использую, и всегда всё работало. более того, и в этом проекте работало. отключился после небольшой переработки кода.
Тогда надо смотреть что было "переработано".
Если я делаю всё по Вашим описаниям, всё работает ОК.
(Конечно, не Борланд )
Здравствуйте, Molchalnik, Вы писали:
M>определение: M>ANNdebuglogC __debuglog("c:\\dbg.txt");
M>объявление: M>ANNdebuglogC __debuglog("c:\\dbg.txt");
1) А что такое ANNdebuglogC? Имя класса или какой-то typedef?
2) __debuglog -- это ваше имя переменной или какая-то билдеровская штучка? А то двойное подчёркивание в начале нехорошо.
3) Я так и не нашёл отличий между определением и объявлением...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
А тогда не ясна связь dbglog и __debuglog
Кто-то из них макрос?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Molchalnik, Вы писали:
M>просто тестирую два конструктора сразу — по умолчанию и с названием файла
Я тебе советую не запутывать ситуацию, а распутывать.
Тестируй что-нибудь одно. Например, вариант с именем файла...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, 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()
То, что это лог, наводит таки на мысли, что запись происходит откуда-то не оттуда, откуда надо
Второй вариант -- ты нечаянно сломал что-то в проекте и теперь просто из рантайма не вызывается точка входа, отвечаюзая за создание статических объектов...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Molchalnik, Вы писали:
M>Платформа — C++builder 6
M>проблема в том, что конструктор класса вообще не вызывается. M>при обращении к функциям класса программа валится по причине неинициализированности класса. есть два конструктора, с параметрами и без, пробовал оба, не выходит(((
off: объекта, а не класса
M>если же создавать через new, то всё нормально. конструктор нормально вызывается. M>почему???
широкоизвестный глюк борландовского компилятора. например, похожая тема
M>что делать???
сменить компилер
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, Molchalnik, Вы писали:
E>1) А что такое ANNdebuglogC? Имя класса или какой-то typedef?
ANNdebuglogC — это мой класс, который создаёт файл лога и пишет в него, а так же сохраняет бэкап-копии лога
E>2) __debuglog -- это ваше имя переменной или какая-то билдеровская штучка?
__debuglog — экземпляр класса ANNdebuglogC
E>А то двойное подчёркивание в начале нехорошо.
уже убрал. а почему нехорошо?
E>3) Я так и не нашёл отличий между определением и объявлением...
там, если другие мои ответы почитать, исправлено на это: