2013-05-28 2 views
2

Как-то мои глобальные объекты создаются без их соответствующих конструкторов называют:Глобальный конструктор объекта не вызывалось

static int num = 0; 
class TestClass 
{ 
public: 
    int a; 
    float b; 
    TestClass(float f) 
    { 
     a = 55; 
     b = f; 
     ++num; 
    } 
}; 
TestClass test(32); 

int main(int argc,char *argv[]) 
{ 
    std::cout<<"Int: "<<test.a<<std::endl; 
    std::cout<<"Float: "<<test.b<<std::endl; 
    std::cout<<"Constructor has been called "<<num<<" times"<<std::endl; 
    while(true); 
    return 0; 
} 

Выхода:

Int: 0 
Float: 0 
Constructor has been called 0 times 

Я использовал конструктор, как это в разные проекты раньше и никогда не сталкивались с такими проблемами. Я пробовал безпараметрический конструктор и делал тестовую переменную статичной, и не имел никакого другого эффекта. Может ли кто-нибудь просветить меня о том, что здесь происходит?

Я использую визуальную студию 2010, в случае, если это имеет значение.

+1

В случае, если кто-то заинтересован, [на ideone] (http://ideone.com/3pnvDc), он работает отлично. – Dukeling

+0

Ваш код дает мне правильный результат. –

+5

Это ваш точный код? В частности, это глобальный тест TestClass и 'int num' в том же файле? –

ответ

2

Я не совсем уверен, но это может ответить на ваш вопрос: http://www.nsnam.org/docs/linker-problems.doc

Отредактировано добавить больше информации:

Документ указывает на проблемы, которые могут возникнуть при использовании глобальных конструкторов в разных единицах компиляции , Например, если вы определяете объект глобально в некоторой динамически связанной библиотеке, его конструктор объекта может не вызываться при доступе к методу из этой библиотеки.

Чтобы использовать пример из оригинального вопроса: Класс TestClass и глобальный объект test может быть в TestLibrary.dll в то время как функция main() в какой-то исполняемый файл. В зависимости от способа загрузки TestLibrary.dll и объекта test из исполняемого файла его конструктор никогда не может вызываться, потому что библиотека никогда не «информирована» о том, что она была просто загружена (или, по-другому, глобальная функция инициализации никогда не вызывалась).

+2

Не могли бы вы обобщить содержание этой ссылки для тех, у кого нет слова, и если ссылка перестанет работать? –

+0

... и в частности, какая часть 17-страничного документа устраняет проблему. Полезные ссылки поощряются, но в целом они должны быть комментариями вместо ответов **, если ** вы ** полностью ** не отвечаете на вопрос и просто включаете ссылку в «это где я нашел это». – Dukeling

+0

Вы правы. Сожалею. Я просто добавил дополнительную информацию, чтобы сделать этот ответ более полезным. –

0

Если вы скомпилируете свой проект, который вы связываете с исполняемым, в исполняемый файл, Visual Studio свяжет все отлично, но ваш глобальный конструктор не будет вызван.

Смежные вопросы