AKB Forums

Go Back   AKB Forums > Technical sections > Languages, Compilers and Interpreters
Home Register Blogs FAQ Members List Calendar Downloads Arcade Mark Forums Read

Languages, Compilers and Interpreters C,C++,C#,.NET,Java,PHP,Perl,SQL and more

Troubles when posting message? Click here! :: Проблемы с отправлением сообщения? Нажмите сюда!

Reply
 
LinkBack Thread Tools Display Modes
Old Mar 11, 2004, 16:54   #1
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: Jan 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,178
Rep Power: 7
Reputation: 45
static virtual function

интересно, почему в c++ нет статические функции невозможно сделать виртуальными? не думаю, что с реализацией возникли бы какие-то технические трудности - все реализуется так же, как с обычными функциями, только this не предается. зато можно было бы по динамическому указателю вызывать и статические функции класса... в комитете посчитали этот случай слишком редким и ненужным?
Aram Hambardzumyan is offline   Reply With Quote Quote selected
Old Mar 11, 2004, 17:31   #2
Administrator
 
greka's Avatar
 
Join Date: Sep 2001
Location: @work
Posts: 5,347
Rep Power: 10
Reputation: 23
Send a message via ICQ to greka
то, что ты предлагаешь (предполагаешь), звучит так /если я правильно сформулировал для себя/:

разрешите статические виртуальные ф-ции, но так, чтоб они принимали как минимум 1 параметр - указатель на динамические объекты.

/потому что в ином случае статический виртуальный мембер становится out-of-use/


принуждать программеров нехорошо, не так ли ?
__________________
И повешенные могут качаться в неположенную сторону. /С.Е.Лец/
greka is offline   Reply With Quote Quote selected
Old Mar 11, 2004, 17:41   #3
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: Jan 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,178
Rep Power: 7
Reputation: 45
Quote:
Originally Posted by greka
то, что ты предлагаешь (предполагаешь), звучит так /если я правильно сформулировал для себя/:

разрешите статические виртуальные ф-ции, но так, чтоб они принимали как минимум 1 параметр - указатель на динамические объекты.
нет, пусть сигнатура остается такой же, как сейчас, так что ее можно вызвать и от класса. но если вызывать динамически, то тип класса через указатель на объект определяется динамически, а не как сегодня - статически
Aram Hambardzumyan is offline   Reply With Quote Quote selected
Old Mar 11, 2004, 17:58   #4
Administrator
 
greka's Avatar
 
Join Date: Sep 2001
Location: @work
Posts: 5,347
Rep Power: 10
Reputation: 23
Send a message via ICQ to greka
а динамически - это как?
положим, ты - компилятор.

как ты будешь различать, кто этот метод вызвал ?
__________________
И повешенные могут качаться в неположенную сторону. /С.Е.Лец/
greka is offline   Reply With Quote Quote selected
Old Mar 11, 2004, 19:23   #5
Грустно...
 
Agregat's Avatar
 
Join Date: Aug 2002
Location: Там, где всегда идут дожди
Posts: 21,546
Rep Power: 11
Reputation: 169
Send a message via ICQ to Agregat Send a message via MSN to Agregat
В новом стандарте С++ собираются ввести мультиметоды, сейчас есть реализации в некоторых библиотеках. А статическая функция по определению не может быть виртуальной.
Тебе скорее всего нужна callcback или потоковая функция... так для этого есть методы.
__________________
http://аvitya.livejournal.com
Хотели, как лучше, а получилось даже хуже...
Лозунг шахматиста: На каждый шах - ответим матом!
Agregat is offline   Reply With Quote Quote selected
Old Mar 12, 2004, 05:16   #6
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: Jan 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,178
Rep Power: 7
Reputation: 45
Quote:
Originally Posted by greka
а динамически - это как?
положим, ты - компилятор.

как ты будешь различать, кто этот метод вызвал ?
для статической функции компилятор обычным же способом записывает ее адрес в виртуальную таблицу, а при вызове через полиморфный указатель, замечая, что функция объявлена виртуальной, вызывает через таблицу, только поскольку ему известно, что она статична, он не передает адрес объекта
Aram Hambardzumyan is offline   Reply With Quote Quote selected
Old Mar 12, 2004, 08:38   #7
Грустно...
 
Agregat's Avatar
 
Join Date: Aug 2002
Location: Там, где всегда идут дожди
Posts: 21,546
Rep Power: 11
Reputation: 169
Send a message via ICQ to Agregat Send a message via MSN to Agregat
Понимаешь как, виртуальная функция - требует наличия объекта - статическая не требует. Ты ее можешь вывать, как CMyMother****ingClass::MyMother****ingStaticFuncti on(); - a если нет объекта - тогда нет виртуальной таблицы.
__________________
http://аvitya.livejournal.com
Хотели, как лучше, а получилось даже хуже...
Лозунг шахматиста: На каждый шах - ответим матом!
Agregat is offline   Reply With Quote Quote selected
Old Mar 12, 2004, 10:10   #8
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: Jan 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,178
Rep Power: 7
Reputation: 45
Quote:
Originally Posted by Agregat
Понимаешь как, виртуальная функция - требует наличия объекта - статическая не требует. Ты ее можешь вывать, как CMyMother****ingClass::MyMother****ingStaticFuncti on(); - a если нет объекта - тогда нет виртуальной таблицы.
понимаю, но статическая имеет два способя вызова - через имя класса и через объект. во втором случает конечно объект ей не передается, но компилятор мог бы использовать его для доступа к таблице. ну а в первом вызывать как есть
Aram Hambardzumyan is offline   Reply With Quote Quote selected
Old Mar 12, 2004, 11:19   #9
Грустно...
 
Agregat's Avatar
 
Join Date: Aug 2002
Location: Там, где всегда идут дожди
Posts: 21,546
Rep Power: 11
Reputation: 169
Send a message via ICQ to Agregat Send a message via MSN to Agregat
то есть получается компилятор должен решать это просто статическая, а это виртуальная статическая? Фигня выходит. Сделай сам, как грицца:
PHP Code:
class CBase
{
...
static 
VirtualProcessing(CBase theBase) {theBase->myVirtualFunc();}
virtual void myVirtualFunc() = 0;
};

class 
CD1 : public CBase
{
void myVirtualFunc() {cout << "CD1" <<endl;
};

class 
CD2 : public CBase
{
void myVirtualFunc() {cout << "CD2" <<endl;
};

int main()
{
  
vector<CBase*> vec;
/// some code
  
for (vector<CBase*>::iterator i vec.begin(), vec.end(); != e; ++i)
  {
     (*
i)->VirtualProcessing(*i);
  }
  return 
0;

вот и все.
__________________
http://аvitya.livejournal.com
Хотели, как лучше, а получилось даже хуже...
Лозунг шахматиста: На каждый шах - ответим матом!
Agregat is offline   Reply With Quote Quote selected
Old Mar 12, 2004, 12:04   #10
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: Jan 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,178
Rep Power: 7
Reputation: 45
это конечно решение, но не такое красивое, как виртуальная статическая функция. а если красота - субъективный аргумент, то вот и объективный: написание дополнительной функции и передача параметра в статическую функцию
Aram Hambardzumyan is offline   Reply With Quote Quote selected
Old Mar 12, 2004, 13:33   #11
Грустно...
 
Agregat's Avatar
 
Join Date: Aug 2002
Location: Там, где всегда идут дожди
Posts: 21,546
Rep Power: 11
Reputation: 169
Send a message via ICQ to Agregat Send a message via MSN to Agregat
могу красивее: прицепи к проекту boost.lambda там есть функтор bind, который просто будет вызывать эту фунцкию и код будет таким
PHP Code:
///...
std::for_each(vec.begin(), vec.end(), boost::lambda::bind(CBase::VirtualProcessing_1));
///.... 
Красиво, элегантно, эстетично.
__________________
http://аvitya.livejournal.com
Хотели, как лучше, а получилось даже хуже...
Лозунг шахматиста: На каждый шах - ответим матом!
Agregat is offline   Reply With Quote Quote selected
Old Mar 12, 2004, 13:46   #12
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: Jan 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,178
Rep Power: 7
Reputation: 45
мой вопрос носит исключительно теоретический характер, и я хочу только знать, почему эту возможность не реализовали, а не альтернативные пути реализации

Last edited by Aram Hambardzumyan : Mar 13, 2004 at 07:11.
Aram Hambardzumyan is offline   Reply With Quote Quote selected
Old Mar 12, 2004, 19:21   #13
Грустно...
 
Agregat's Avatar
 
Join Date: Aug 2002
Location: Там, где всегда идут дожди
Posts: 21,546
Rep Power: 11
Reputation: 169
Send a message via ICQ to Agregat Send a message via MSN to Agregat
Я сказал выше, что это неправильно. Статическая функция на то и статическая, чтобы не быть виртуальной.
__________________
http://аvitya.livejournal.com
Хотели, как лучше, а получилось даже хуже...
Лозунг шахматиста: На каждый шах - ответим матом!
Agregat is offline   Reply With Quote Quote selected
Old Mar 13, 2004, 07:19   #14
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: Jan 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,178
Rep Power: 7
Reputation: 45
Quote:
Originally Posted by Agregat
Я сказал выше, что это неправильно. Статическая функция на то и статическая, чтобы не быть виртуальной.
это неправильно только потому, что так решили при создании и стандартизации языка. а могли бы и допустить статические виртуальные функции, я не вижу этому технических помех. вопрос в том, почему не сделали?
Aram Hambardzumyan is offline   Reply With Quote Quote selected
Old Mar 13, 2004, 09:27   #15
Грустно...
 
Agregat's Avatar
 
Join Date: Aug 2002
Location: Там, где всегда идут дожди
Posts: 21,546
Rep Power: 11
Reputation: 169
Send a message via ICQ to Agregat Send a message via MSN to Agregat
чтобы была виртуальной требуется this. если же она статическая - то получается разное поведение когда она вызывается, как CMyClass::Func() и CBase->Func()
__________________
http://аvitya.livejournal.com
Хотели, как лучше, а получилось даже хуже...
Лозунг шахматиста: На каждый шах - ответим матом!
Agregat is offline   Reply With Quote Quote selected
Reply


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On


Similar Threads
Thread Thread Starter Forum Replies Last Post
static variables in class member functions hov Languages, Compilers and Interpreters 6 Sep 23, 2002 19:18
static variables in class member functions hov Languages, Compilers and Interpreters 0 Sep 21, 2002 09:33
Armenian Unicode - Java Unicode Virtual Keyboard. Eddi Web sites 0 Jul 10, 2002 07:54
virtual keyboard PsilocybeLarvae General 2 Mar 25, 2002 15:30
Virtual inheritance ?? Taurus Languages, Compilers and Interpreters 3 Mar 6, 2002 13:34


All times are GMT. The time now is 12:12.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
This board was founded on September 29, 2001
Powered by Viper Internet

Affordable Web Hosting | ParevNet

Buy text link