Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Замарочки со статическими переменными-членами.


Автор: OlegSK 20.6.2011, 03:08
Помогите, плиз, разобраться со статическими переменными-членами класса. Неожиданно для себя столкнулся с тем, что эта тема гораздо более головоломная, чем казалась с самого начала. Например, выяснилось, что значение статической переменной-члена класса разделяется не только между всеми объектами класса, в котором она определена, но и всеми объектами классов-наследников данного класса. Хотелось бы получить объяснение работы следующей программы, т.к. она работает не так, как я от нее ожидаю:
Код

#include "stdafx.h"
#include <iostream>

using std::cout;
using std::endl;

class cBasic
{
public:
    int h_GetVar();
    static int h_TestVar;
};

class cTest : public cBasic
{
public:
    int h_GetVar_2();
    static int h_TestVar;
};

int cBasic::h_TestVar = 333;
int cTest::h_TestVar = 444;

int cBasic::h_GetVar()
{
    return h_TestVar;
}

int cTest::h_GetVar_2()
{
    return h_TestVar;
}

int _tmain(int argc, _TCHAR* argv[])
{
    cBasic x;
    cTest y;
    cout << x.h_GetVar() << endl;
    cout << y.h_GetVar() << endl; // <<< Здесь выводится не то, что я ожидаю...
    cout << y.h_GetVar_2() << endl;
    cout << cBasic::h_TestVar << endl;
    cout << cTest::h_TestVar << endl;

    system("PAUSE");
    return 0;
}


В этой программе я попытался сделать так, чтобы значение статической переменной h_TestVar не разделялось между классами cBasic и cTest. Собственно, непонятка происходит в строке, которая отмечена комментарием. Непонятка заключается в том, что метод h_GetVar() класса cTest возвращает значение не той статической переменной которой требуется. Раз этот метод вызывается в классе cTest, то я ожидаю, что он вернет мне значение статической переменной h_TestVar, которая объявлена в этом классе. Вместо этого, мне возвращается значение статической переменной h_TestVar, которая объявлена в классе cBasic... Это вообще нормально? Почему так происходит? Разве переменная-член h_TestVar объявленная в классе с Test не должна перекрывать одноименную переменную член из класса cBasic? С другой стороны, метод h_GetVar_2 класса cTest делает то, что я от него и ожидаю, а значит перекрытие статической переменной все таки происходит...

Автор: asmdzen 20.6.2011, 09:49
вроде все правильно, метод и переменная объявлены в одном и том же классе, вот h_GetVar() и возвращает то что он видит, то есть переменную член своего класса. h_GetVar_2() видит уже перекрывающюю переменную из своего класса.

Автор: OlegSK 20.6.2011, 10:31
Цитата(asmdzen @  20.6.2011,  09:49 Найти цитируемый пост)
вроде все правильно

Благодарю за ответ! В той книге, которую я читал (книга начального уровня) об этом ничего не говорилось...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)