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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> static в виртуальном методе класса, для каждого объекта он свой? 
:(
    Опции темы
bel_nikita
  Дата 9.2.2006, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Статическая функция класса понятно: одна для всех объектов данного класса. А вот, статическая переменная в виртуальном методе класса - это как будет?
Код

class cBase
{
virtual int OnMessage() = 0;
};

class cDerived: public cBase
{
virtual int OnMessage();
};

int cDerived::OnMessage()
{
static int iCount = 0;  // Этот статик для всех объектов действует? Или для каждого объекта он свой?
return 0;
}



--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Ignat
Дата 9.2.2006, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

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



bel_nikita, а почему в методе, а не как член класса?
ИМХО, будет для каждого свой, т.к. нет видимости вне метода.


--------------------
Теперь при чем :P
PM   Вверх
volvo877
Дата 9.2.2006, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

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



bel_nikita, а проверить?

Код
#include <iostream>
using namespace std;

class A {
  virtual int f() = 0;
};

class B: public A {
public:
  virtual int f() {
    static int count = 0;
    cout << "count = " << count << endl;
    ++count;
  }
};

int main() {

  B one, two;
  one.f();
  two.f();

  return 0;

}

В результате имеем
Код
count = 0
count = 1

Значит, все-же переменная-то одна...
PM MAIL   Вверх
azesmcar
Дата 9.2.2006, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата

это как будет?


А какая разница? Для обычной функции то одна...без разницы для виртуальной или нет...виртуальная функция тоже функция smile ничем особым (как функция) не отличается...вызывается по другому...но принципиальной разницы для области видимости и всего остального быть не должно...статик он и в Африке статик smile
PM   Вверх
Aveic
Дата 9.2.2006, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 9.2.2006
Где: Да все мы из одно й ямы

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



вопрос, какой-то надуманный... не мог же произойти конфликт между эти статическими переменными,
функции то для каждого объекта разные...
PM MAIL ICQ   Вверх
Ignat
Дата 9.2.2006, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

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



Цитата(Aveic @ 9.2.2006, 14:55 Найти цитируемый пост)

не мог же произойти конфликт между эти статическими переменными

При чем тут конфликт? Речь о том будет доступ или нет...


--------------------
Теперь при чем :P
PM   Вверх
azesmcar
Дата 9.2.2006, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Забыл добавить что написанное мной действует в области одной функции...
volvo877

К примеру если наследовать от класса B
Код

#include <iostream>

using namespace std;

class A
{
    virtual int f() = 0;
};

class B: public A
{
public:
  virtual int f()
  {
    static int count = 0;
    cout << "count = " << count << endl;
    ++count;
    return 0;
  }
};

class C: public B
{
public:
  virtual int f()
  {
    static int count = 0;
    cout << "count = " << count << endl;
    ++count;
    return 0;
  }
};

int main() {
  B one, two;
  B *three = new C;
  one.f();
  two.f();
  three->f();
  delete three;
  return 0;
}

получим
Цитата

count = 0
count = 1
count = 0

Добавлено @ 15:38
Но тут уж полиморфизм невиновен smile

код
Код

#include <iostream>

class CTest
{
public:
    CTest()
    {
    };
    ~CTest()
    {
    };
    void f1()
    {
        static int t = 0;
        std::cout << "f1()=" << ++t << std::endl;
    }
    void f2()
    {
        static int t = 0;
        std::cout << "f2()=" << ++t << std::endl;
    }
protected:
private:
};

int main()
{
    CTest q;
    q.f1();
    q.f2();
    return 0;
}


также выдаст нам
Цитата

f1()=1
f2()=1

PM   Вверх
volvo877
Дата 9.2.2006, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

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



azesmcar, насколько я понял из вопроса:
Цитата(bel_nikita @ 9.2.2006, 11:53 Найти цитируемый пост)

Статическая функция класса понятно: одна для всех объектов данного класса. А вот, статическая переменная в виртуальном методе класса - это как будет?

подразумевалось именно, будет ли переменная общей для всех экземпляров одного класса... В твоем примере - уже вводится второй...
PM MAIL   Вверх
Ignat
Дата 9.2.2006, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

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



А мне вот стало интересно, возможно ли обратиться к этой переменной вне метода? С одной стороны переменная локальна и невидна, с другой стороны размещение в памяти не меняется... Можно ли создать указатель на неё?


--------------------
Теперь при чем :P
PM   Вверх
azesmcar
Дата 9.2.2006, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата

Статическая функция класса понятно: одна для всех объектов данного класса


А я вот другого не понял...какая разница? статическая, нестатическая...функция все равно одна на все обьекты класса...просто this разный передается...не xотите же вы сказать что при создании каждого обьекта класса заново копируются функции...причем тут это?

Я думаю "Для разныx функций разные, для одной одно и тоже" звучит как ответ...

Ignat

можно так
Код

class CTest
{
public:
    CTest()
    {
    };
    ~CTest()
    {
    };
    static int& f()
    {
        static int t = 0;
        return t;
    }
    void f1()
    {
        std::cout << f()++ << std::endl;
    }
    void f2()
    {
        extern int t;
        std::cout << f()++ << std::endl;
    }
protected:
private:
};


получим
0
1
Добавлено @ 16:01
Кстати

static int& f() можно заменить на int& f()...дело вкуса smile
Добавлено @ 16:04
со static int & можно даже вне класса

Код

CTest::f()++;

PM   Вверх
Earnest
Дата 9.2.2006, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Цитата(Ignat)

А мне вот стало интересно, возможно ли обратиться к этой переменной вне метода? С одной стороны переменная локальна и невидна, с другой стороны размещение в памяти не меняется... Можно ли создать указатель на неё?

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


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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