WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  Q about "this"..

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Q about "this"..
lx опубликован 22-08-2001 14:29 MSK   Click Here to See the Profile for lx   Click Here to Email lx  
Народ, есть такая модель:

класс А: метод1 , метод2, ...

далее: класс В, класс С и тд - все производные от А с переопределенными методами (метод1, метод2 и тд...).

Можно ли сделать так, что бы this в классе B стал this для класса С например? Если можно, то как? Ведь this фактически представляет из себя просто контейнер указателей на члены таблицы виртуальных методов, то есть теоретически это сделать возможно. Но как это синтаксичечки реализовать? Мож я чего не понимаю, сорри.

пасибо.

stan опубликован 22-08-2001 14:35 MSK     Click Here to See the Profile for stan  Click Here to Email stan     
Если есть кусок кода
CSomeClass a;
то &a это и есть this. Где хочешь, там и используй
stan опубликован 22-08-2001 14:36 MSK     Click Here to See the Profile for stan  Click Here to Email stan     
Если есть кусок кода
CSomeClass a;
то &a это и есть this. Где хочешь, там и используй
Flex Ferrum опубликован 22-08-2001 15:18 MSK     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
Не получится. Если ты имеешь в виду иерархию типа:
class A
{
public:
virtual void F1();
virtual void F2();
};

class B : public class A
{
public:
virtual void F1();
virtual void F2();
};

class C: public class A
{
public:
virtual void F1();
virtual void F2();
};

То, this в классе B у тебя указывает в том числе на таблицу виртуальных функций, переопределенных в классе B, а this в классе C - соответственно та vtable класса C. И эти две таблицы ни при каких условиях совпадать не будут. По сему, в "находясь" в классе B ты никаким образом не сможешь получить доступ к vtable класса C и наоборот.
А синтаксически реализовать эту идею можно так, но, как я сказал выше, корректно работать это не будет:

void * Ptr = this;
C * pC = (C *)Ptr;

lx опубликован 22-08-2001 16:59 MSK     Click Here to See the Profile for lx  Click Here to Email lx     
stan: я наверно неясно изложил, поэтому твой ответ вовсе таковым не является.

Flex Ferrum: конструкция то такая. но ответ не совсем тот. это как бы внешняя смена типа. А можно ли тоже проделать внутри объекта? тут даже как то трудно объясить. как бы вот сидя внутри запорожца переделать его в мерен? -) скажем так. хотя тоже не точно сформулирован вопрос. ну может кто нить такие фокусы делать умеет поделитесь.

пасиба

Flex Ferrum опубликован 22-08-2001 17:11 MSK     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
Ммммм... То-есть ты хочешь в рантайме поменять одну виртуальную таблицу на другую? Не затрагивая при этом данные? ИМХО, для этого тебе придется разабраться в структуре того, на что указывает this (где там указатели на базовые классы, где на vtable и т. п.), после чего аккуратно ручками заменить одно на другое. Но это будет, в общем случае, работать только для данной конкретной реализации данного конкретного компилятора. И то, если хранится указатель на vtable. Если же vtable при конструировании копируется в объект, то вообще никак.
lx опубликован 22-08-2001 17:50 MSK     Click Here to See the Profile for lx  Click Here to Email lx     
вот то то и оно. ты правильно понял. пока я сам в эти дебри не полезу. может фокусник все же найдется. а вот насчет привязки к компилятору - это трабла мощная. если ответов не будет, буду выяснять.
Flex Ferrum опубликован 22-08-2001 17:54 MSK     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
А может быть, над иерархией поработашь. Ведь, по сути дела, наследование для этого и придумывали. Попробуй применить множественное наследование.
lx опубликован 22-08-2001 19:23 MSK     Click Here to See the Profile for lx  Click Here to Email lx     
в том то и дело, что с наследованием все уже сделано как надо. просто када мне задание давали, первое что пришло в голову - это "крякнуть" this. Но я чуть себе голову не крякнул и сделал по крестьянски. А вопрос с this остался. И мучает. Но все равно спасибо.

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.