Определить адрес внешнего класса из локального
От: Аноним  
Дата: 27.09.07 15:14
Оценка:
Привет!

Может кто знает, как определить в локальном классе адрес внешнего (без явной его передачи в локальный класс)?
То есть
class Outer
{
    void f()
    {
        class inner
        {
            void g()
            {
                /*GetOuter()->z()*/
            }
        };
    }

    void z() {}
};


Подскажите, пожалуйста.
Re: Определить адрес внешнего класса из локального
От: Bell Россия  
Дата: 27.09.07 15:16
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Подскажите, пожалуйста.

Подсказываю: никак.
Любите книгу — источник знаний (с) М.Горький
Re[2]: Определить адрес внешнего класса из локального
От: Аноним  
Дата: 27.09.07 15:30
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, Аноним, Вы писали:


А>>Подскажите, пожалуйста.

B>Подсказываю: никак.
Спасибо за ёмкий ответ
Re: Определить адрес внешнего класса из локального
От: remark Россия http://www.1024cores.net/
Дата: 27.09.07 15:31
Оценка: 1 (1) +1
Здравствуйте, Аноним, Вы писали:

А>Может кто знает, как определить в локальном классе адрес внешнего (без явной его передачи в локальный класс)?


Никак. Вложенность — это свойство определений классов. Адреса — это свойства объектов. Они *никак* не связаны.
Подумай над следующим примером:

struct A
{
  struct B
  {
  };
};

int main
{
  A::B b; // адрес какого объекта класса А должен в данном случае определять объект b класса B?!
}



Или такой более тонкий пример:

struct A
{
  struct B
  {
  };

  B b1;
  B b2;
};




1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: Определить адрес внешнего класса из локального
От: Bell Россия  
Дата: 27.09.07 15:41
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>>Подскажите, пожалуйста.

B>>Подсказываю: никак.
А>Спасибо за ёмкий ответ

Пожалуйста
Если не хватает полноты — то можно помедитировать над примерами remark-а.
Но лучше, ИМХО, ёмко рассказать о том, почему и зачем возникла такая необходимость
Любите книгу — источник знаний (с) М.Горький
Re[2]: Определить адрес внешнего класса из локального
От: remark Россия http://www.1024cores.net/
Дата: 27.09.07 16:12
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, Аноним, Вы писали:


А>>Подскажите, пожалуйста.

B>Подсказываю: никак.

Ты первый, зато у меня с примерами


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: Определить адрес внешнего класса из локального
От: Bell Россия  
Дата: 28.09.07 06:17
Оценка: :))
Здравствуйте, remark, Вы писали:

B>>Здравствуйте, Аноним, Вы писали:


А>>>Подскажите, пожалуйста.

B>>Подсказываю: никак.

R>Ты первый, зато у меня с примерами


R>


Золотое правило механики в действии — выигрываешь в мощности — проигрываешь в скорости
Любите книгу — источник знаний (с) М.Горький
Re: Определить адрес внешнего класса из локального
От: MasterZiv СССР  
Дата: 28.09.07 10:04
Оценка: -1 :))
Аноним 361 пишет:
> Может кто знает, как определить в локальном классе адрес внешнего (без
> явной его передачи в локальный класс)?

Адрес класса определить невозмножно. Потому что у класса не существует
адреса.

Если имелись в виду все же объекты класса, то объект вложенного
класса никак неявно не связан с объектом охватывающего его класса.
Это тебе не Java какая-нибудь. Это — нормальный язык программирования.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Определить адрес внешнего класса из локального
От: _Obelisk_ Россия http://www.ibm.com
Дата: 29.09.07 09:37
Оценка:
Здравствуйте, MasterZiv, Вы писали:


MZ>Если имелись в виду все же объекты класса, то объект вложенного

MZ>класса никак неявно не связан с объектом охватывающего его класса.
MZ>Это тебе не Java какая-нибудь. Это — нормальный язык программирования.

Не совсем верно. По смещению можно определить адрес внешнего объекта в некоторых случаях:

У себя в коде использовал нечто следующее

#define FEATURE_OFFSET(FEATURE,TYPE) \
    ((TYPE::owner_t*)((char*)(&feature)-(size_t)&((TYPE::owner_t*)0)->FEATURE))

class CFeature
{
public:
    typedef A owner_t;
    A* Owner() { return GetFeatureOwner(*this); }
};

class A
{
public:
    CFeature feature;
};

inline A* GetFeatureOwner(CFeature& feature)
{
    return FEATURE_OFFSET(feature,CFeature);
}

A* pA = new A();
pA->feature.Owner() == pA;


Думаю, идея понятна. Такой трюк можно использовать для экономии памяти на pointer-е к окружающему объекту при реализации таких вещей как property (и т.п.) Подобные задачи возникают, например, при реализации AST-ов. Подход лучше всего работает при автоматической генерации кода.



Душа обязана трудиться! (с) Н.Заболоцкий.
Re[2]: Определить адрес внешнего класса из локального
От: Аноним  
Дата: 04.10.07 12:10
Оценка:
Здравствуйте, remark, Вы писали:

R>Здравствуйте, Аноним, Вы писали:


А>>Может кто знает, как определить в локальном классе адрес внешнего (без явной его передачи в локальный класс)?


R>Никак. Вложенность — это свойство определений классов. Адреса — это свойства объектов. Они *никак* не связаны.

R>Подумай над следующим примером:

R>
R>struct A
R>{
R>  struct B
R>  {
R>  };
R>};

R>int main
R>{
R>  A::B b; // адрес какого объекта класса А должен в данном случае определять объект b класса B?!
R>}
R>


Вообще-то в моём примере
Автор:
Дата: 27.09.07
не вложенный класс, а локальный, то есть находящийся внутри метода класса.

R>Или такой более тонкий пример:


R>
R>struct A
R>{
R>  struct B
R>  {
R>  };

R>  B b1;
R>  B b2;
R>};
R>


Возможно, по-хорошему (по стандарту) нельзя, но, в принципе, кто мешает найти разницу this и &A::b1 (или A::b2)? Это и будет (по крайней мере на VC) адрес A.
Re[3]: Определить адрес внешнего класса из локального
От: remark Россия http://www.1024cores.net/
Дата: 04.10.07 12:16
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, remark, Вы писали:


R>>Здравствуйте, Аноним, Вы писали:


А>>>Может кто знает, как определить в локальном классе адрес внешнего (без явной его передачи в локальный класс)?


R>>Никак. Вложенность — это свойство определений классов. Адреса — это свойства объектов. Они *никак* не связаны.

R>>Подумай над следующим примером:

R>>
R>>struct A
R>>{
R>>  struct B
R>>  {
R>>  };
R>>};

R>>int main
R>>{
R>>  A::B b; // адрес какого объекта класса А должен в данном случае определять объект b класса B?!
R>>}
R>>


А>Вообще-то в моём примере
Автор:
Дата: 27.09.07
не вложенный класс, а локальный, то есть находящийся внутри метода класса.


Eto chto-to menyaet?


R>>Или такой более тонкий пример:


R>>
R>>struct A
R>>{
R>>  struct B
R>>  {
R>>  };

R>>  B b1;
R>>  B b2;
R>>};
R>>


А>Возможно, по-хорошему (по стандарту) нельзя, но, в принципе, кто мешает найти разницу this и &A::b1 (или A::b2)? Это и будет (по крайней мере на VC) адрес A.


Togda eto uzhe ne operatsiya klassa, a operatsiya ob'jekta. T.e. tebe pridetsa vo "vnutrenniy" klass dobavlyat' dopolnitel'niy chlen, kotoriy bi govoril kakoy imenno eto iz chlenov "vneshnego" klassa.



1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[4]: Определить адрес внешнего класса из локального
От: Аноним  
Дата: 04.10.07 12:39
Оценка:
Здравствуйте, remark, Вы писали:

А>>>>Может кто знает, как определить в локальном классе адрес внешнего (без явной его передачи в локальный класс)?


R>>>Никак. Вложенность — это свойство определений классов. Адреса — это свойства объектов. Они *никак* не связаны.

R>>>Подумай над следующим примером:

R>>>
R>>>struct A
R>>>{
R>>>  struct B
R>>>  {
R>>>  };
R>>>};

R>>>int main
R>>>{
R>>>  A::B b; // адрес какого объекта класса А должен в данном случае определять объект b класса B?!
R>>>}
R>>>


А>>Вообще-то в моём примере
Автор:
Дата: 27.09.07
не вложенный класс, а локальный, то есть находящийся внутри метода класса.


R>Eto chto-to menyaet?

Разница в том, что если метод не статический, у него всегда есть this класса. И это, возможно, можно было бы как-то использовать в локальном классе. А в этом примере struct B может быть создана и отдельно от struct A.


R>>>Или такой более тонкий пример:


R>>>
R>>>struct A
R>>>{
R>>>  struct B
R>>>  {
R>>>  };

R>>>  B b1;
R>>>  B b2;
R>>>};
R>>>


А>>Возможно, по-хорошему (по стандарту) нельзя, но, в принципе, кто мешает найти разницу this и &A::b1 (или A::b2)? Это и будет (по крайней мере на VC) адрес A.


R>Togda eto uzhe ne operatsiya klassa, a operatsiya ob'jekta. T.e. tebe pridetsa vo "vnutrenniy" klass dobavlyat' dopolnitel'niy chlen, kotoriy bi govoril kakoy imenno eto iz chlenov "vneshnego" klassa.


Да, если объектов не один, то придётся. Но, по-правде говоря, не пойму как это связано с моим вопросом.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.