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


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

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

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

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

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

Автор: volvo877 9.2.2006, 13:30
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

Значит, все-же переменная-то одна...

Автор: azesmcar 9.2.2006, 14:33
Цитата

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


А какая разница? Для обычной функции то одна...без разницы для виртуальной или нет...виртуальная функция тоже функция smile ничем особым (как функция) не отличается...вызывается по другому...но принципиальной разницы для области видимости и всего остального быть не должно...статик он и в Африке статик smile

Автор: Aveic 9.2.2006, 14:55
вопрос, какой-то надуманный... не мог же произойти конфликт между эти статическими переменными,
функции то для каждого объекта разные...

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

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

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

Автор: azesmcar 9.2.2006, 15:34
Забыл добавить что написанное мной действует в области одной функции...
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

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

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

подразумевалось именно, будет ли переменная общей для всех экземпляров одного класса... В твоем примере - уже вводится второй...

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

Автор: azesmcar 9.2.2006, 16:00
Цитата

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


А я вот другого не понял...какая разница? статическая, нестатическая...функция все равно одна на все обьекты класса...просто 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()++;

Автор: Earnest 9.2.2006, 19:39
Цитата(Ignat)

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

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

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