Определение статической переменной класса ...
От: Аноним  
Дата: 03.11.06 18:29
Оценка:
У меня существует класс
CListCtrlEx : public CListCtrl
{
private:
static CFont m_font

...
}

и классы
CListCtrlExFA : public CListCtrlEx
CListCtrlExRA : public CListCtrlEx

Необходимо получить доступ к переменной из CListCtrlEx.
Я пробовал написать (protectedфункцию возвращающую указатель на эту переменную, компилятор ругается , а определив переменную static как protected он опять недоволен
Как же мне сделать одну переменную для всех объектов этих классов?????
Re: Определение статической переменной класса ...
От: Анатолий Широков СССР  
Дата: 03.11.06 19:25
Оценка:
// header file
CListCtrlEx : public CListCtrl 
{
protected:
    static CFont m_font;
};

// cpp module
CFont CListCtrlEx::m_font;



А>Я пробовал написать (protectedфункцию возвращающую указатель на эту переменную, компилятор ругается


Компилятор должен был подсказать в чем проблема. Какая ошибка?
Re[2]: Определение статической переменной класса ...
От: Аноним  
Дата: 03.11.06 19:56
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

АШ>
АШ>// header file
АШ>CListCtrlEx : public CListCtrl 
АШ>{
АШ>protected:
АШ>    static CFont m_font;
АШ>};

АШ>// cpp module
АШ>CFont CListCtrlEx::m_font;
АШ>



А>>Я пробовал написать (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]: Определение статической переменной класса ...
От: Анатолий Широков СССР  
Дата: 03.11.06 20:29
Оценка:
А>>>Я пробовал написать (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]: Определение статической переменной класса ...
От: qvasic Украина  
Дата: 03.11.06 20:48
Оценка:
А>Я так понимаю он не хочет изменять эту переменную??? я вызываю

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

делать нужно так:

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]: Определение статической переменной класса ...
От: np9mi7 Россия  
Дата: 04.11.06 09:44
Оценка:
Здравствуйте, Аноним, Вы писали:

Так много всего написано, а никто и не заметил что ругается не компилятор, а линковщик;

А>Но при определении переменной CFont CListCtrlEx::m_font;


Если есть конструктор копирования, то можно сделать так:
class SomeType {
    static int StaticValue_;
};

int GetStaticValue () {
    return 67;
}

int SomeType::StaticValue_ (GetStaticValue ());

int main () {
}
, то есть инициализировать статическую переменную в отдельной функции;
"В любое мгновение принятия решения, лучшее, что вы можете сделать, это принять правильное решение; следующим лучшим вариантом будет принять неправильное решение, худший вариант – не принимать решения совсем" (c) Теодор Рузвельт.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.