У меня существует класс
CListCtrlEx : public CListCtrl
{
private:
static CFont m_font
...
}
и классы
CListCtrlExFA : public CListCtrlEx
CListCtrlExRA : public CListCtrlEx
Необходимо получить доступ к переменной из CListCtrlEx.
Я пробовал написать (protectedфункцию возвращающую указатель на эту переменную, компилятор ругается , а определив переменную static как protected он опять недоволен
Как же мне сделать одну переменную для всех объектов этих классов?????
А>>Я пробовал написать (protectedфункцию возвращающую указатель на эту переменную, компилятор ругается
АШ>Компилятор должен был подсказать в чем проблема. Какая ошибка?
Error 12 error LNK2001: unresolved external symbol "private: static class CFont CListCtrlEx::m_font" (?m_font@CListCtrlEx@@0VCFont@@A) ListCtrlEx.obj
Error 13 fatal error LNK1120: 1 unresolved externals D:\Project\KTTT_NEW_END\Debug\KTTT.exe 1
Я так понимаю он не хочет изменять эту переменную??? я вызываю
// Определяем переменную шрифта
LOGFONT log;
GetFont()->GetLogFont(&log);
m_font.DeleteObject();
m_font.CreateFontIndirect(&log);
????
Re[3]: Определение статической переменной класса ...
А>>>Я пробовал написать (protectedфункцию возвращающую указатель на эту переменную, компилятор ругается
АШ>>Компилятор должен был подсказать в чем проблема. Какая ошибка?
А>Error 12 error LNK2001: unresolved external symbol "private: static class CFont CListCtrlEx::m_font" (?m_font@CListCtrlEx@@0VCFont@@A) ListCtrlEx.obj
Это следствие того, что статическая переменная только объявлена, но не определна — поместите объявление в какой-нибудь cpp файл:
CFont CListCtrlEx::m_font;
как показано выше.
А>Error 13 fatal error LNK1120: 1 unresolved externals D:\Project\KTTT_NEW_END\Debug\KTTT.exe 1 А>Я так понимаю он не хочет изменять эту переменную??? я вызываю А> // Определяем переменную шрифта А> LOGFONT log; А> GetFont()->GetLogFont(&log); А> m_font.DeleteObject(); А> m_font.CreateFontIndirect(&log); А>????
А эта ошибка уже иного рода. Использовать статическую переменную m_font (если она protected) можно только в методах самого класса CListCtrlEx и методах наследника. А где Вы манипулируете этой переменной?
Re[3]: Определение статической переменной класса ...
А>Я так понимаю он не хочет изменять эту переменную??? я вызываю
нет, он не знает где расположена статическая переменная — то есть, где она пределена.
грубо говоря, когда ты определяешь объект класса, ты определяешь местоположение всех его нестатических членов. но местоположение статических членов это вовсе не определяет — они ведь общие для всех объектов класса. их нужно определять отдельно.
делать нужно так:
class A
{
int i;
static int j;
};
A a;
int A::j;
Re[4]: Определение статической переменной класса ...
От:
Аноним
Дата:
04.11.06 05:55
Оценка:
Здравствуйте, qvasic, Вы писали:
А>>Я так понимаю он не хочет изменять эту переменную??? я вызываю
Q>нет, он не знает где расположена статическая переменная — то есть, где она пределена. Q>грубо говоря, когда ты определяешь объект класса, ты определяешь местоположение всех его нестатических членов. но местоположение статических членов это вовсе не определяет — они ведь общие для всех объектов класса. их нужно определять отдельно.
Q>делать нужно так:
Q>class A Q>{ Q> int i; Q> static int j; Q>};
Q>A a; Q>int A::j;
Да так работает. Но при определении переменной CFont CListCtrlEx::m_font; нельзя указать начальное значение Тобишь нет у неё конструктора, а тело для такого определения кажется писать нельзя Так Где же мне задать её начальное значение???
CFont CListCtrlEx::m_font // Определяем переменную
{
// Определяем переменную шрифта
LOGFONT log;
GetFont()->GetLogFont(&log);
m_font.DeleteObject();
m_font.CreateFontIndirect(&log);
return;
};// ---------------< Вот так не хочет
????????????????
Re[5]: Определение статической переменной класса ...
Так много всего написано, а никто и не заметил что ругается не компилятор, а линковщик;
А>Но при определении переменной CFont CListCtrlEx::m_font;
Если есть конструктор копирования, то можно сделать так:
class SomeType {
static int StaticValue_;
};
int GetStaticValue () {
return 67;
}
int SomeType::StaticValue_ (GetStaticValue ());
int main () {
}
, то есть инициализировать статическую переменную в отдельной функции;
"В любое мгновение принятия решения, лучшее, что вы можете сделать, это принять правильное решение; следующим лучшим вариантом будет принять неправильное решение, худший вариант – не принимать решения совсем" (c) Теодор Рузвельт.