Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Замарочки со статическими переменными-членами. Непонятное поведение 
:(
    Опции темы
OlegSK
Дата 20.6.2011, 03:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.7.2010

Репутация: нет
Всего: нет



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

#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 делает то, что я от него и ожидаю, а значит перекрытие статической переменной все таки происходит...

Это сообщение отредактировал(а) OlegSK - 20.6.2011, 03:20
PM MAIL   Вверх
asmdzen
Дата 20.6.2011, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



вроде все правильно, метод и переменная объявлены в одном и том же классе, вот h_GetVar() и возвращает то что он видит, то есть переменную член своего класса. h_GetVar_2() видит уже перекрывающюю переменную из своего класса.
PM MAIL   Вверх
OlegSK
Дата 20.6.2011, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.7.2010

Репутация: нет
Всего: нет



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

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

Это сообщение отредактировал(а) OlegSK - 20.6.2011, 10:44
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0558 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.