Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.02.2013, 18:24   #1
densvr
Новичок
Джуниор
 
Регистрация: 10.02.2013
Сообщений: 1
По умолчанию [visual c++] инициализация статических членов класса

я пытаюсь собрать на microsoft VS 2010 свой проект в виде файла *.lib (все собирал в режиме debug)
В тестовой версии версии (без сборки в виде библиотеки) все работает.
При сборке библиотеки ошибок нет, а все предупреждения связанны либо с преобразованиями типов, либо с использованием fopen и функций с неограниченным числом аргументов.


Далее, я получаю *.lib-файл, создаю еще один проект в том же решении, прописываю пути к исходникам и *.lib и строю его. Получаю предупреждение о конфликте со стандартной библиотекой: warning LNK4098: defaultlib 'msvcrt.lib' conflicts with use of other libs; use /NODEFAULTLIB:library

Проект вылетает с неявной ошибкой разадресации не инициализированного указателя. Причину обнаружил: у статических данных класса НЕ ВЫЗЫВАЕТСЯ конструктор по умолчанию. Вот упрощенный код:

Код:
//=====CFont.h=======//
#ifndef _CFont_h
#define _CFont_h_
class CFont {
public:
   CFont();
};
#endif

//=====CFont.cpp=====//
#ifndef _CFont_cpp_
#define _CFont_cpp_
#include "CFont.h" 
CFont::CFont() {
}
#endif

//=====CLayer.h=====//
#ifndef _CLayer_h_
#define _CLayer_h_
#include "CFont.h"
class CLayer {
public:
   static CFont m_Font; 
};
#endif

//=======CLayer.cpp=====//
#ifndef _CLayer_cpp_
#define _CLayer_cpp_
#include "CLayer.h"
CFont CLayer::m_Font; //здесь не вызывается конструктор!!!
#endif





=================================================
То же самое в обычном проекте (без библиотек) работает:||
=================================================


//=====CFont.h=======//
#ifndef _CFont_h
#define _CFont_h_
class CFont {
public:
   CFont();
};
CFont::CFont() {
}
#endif

//=====CLayer.h=====//
#ifndef _CLayer_h_
#define _CLayer_h_
#include "CFont.h"
class CLayer {
public:
   static CFont m_Font; 
};
CFont CLayer::m_Font; //здесь конструктор вызывается!!!
#endif


Аналогично с глобальными переменными - конструкторы по умолчанию не вызываются (описывал их в заголовочных файлах со словом extern, а затем в cpp - файлах, через имя класса)


Вопрос: почему у статических данных класса не вызывается конструктор, если инициализировать их в отдельном cpp файле через имя класса, и как вообще вызывать их конструкторы в этом случае?

Последний раз редактировалось densvr; 10.02.2013 в 18:27.
densvr вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Инициализация членов-указателей в конструкторе _-Re@l-_ Общие вопросы C/C++ 4 11.11.2011 20:17
Область видимости членов класса. Lord-of-Hedgehogs Общие вопросы C/C++ 9 27.11.2010 21:29
иниацилизация статических элементов данных класса. Freddi Krjuger Общие вопросы C/C++ 4 26.08.2010 17:54
с++ инициализация статических елементов класса p_alex Помощь студентам 5 25.10.2009 16:52
использование функций не членов класса Наташенька Общие вопросы C/C++ 7 05.10.2009 19:32