Здравствуйте, Аноним, Вы писали:
А>>>Подскажите, пожалуйста. B>>Подсказываю: никак. А>Спасибо за ёмкий ответ
Пожалуйста
Если не хватает полноты — то можно помедитировать над примерами remark-а.
Но лучше, ИМХО, ёмко рассказать о том, почему и зачем возникла такая необходимость
Любите книгу — источник знаний (с) М.Горький
Re[2]: Определить адрес внешнего класса из локального
Здравствуйте, remark, Вы писали:
B>>Здравствуйте, Аноним, Вы писали:
А>>>Подскажите, пожалуйста. B>>Подсказываю: никак.
R>Ты первый, зато у меня с примерами
R>
Золотое правило механики в действии — выигрываешь в мощности — проигрываешь в скорости
Любите книгу — источник знаний (с) М.Горький
Re: Определить адрес внешнего класса из локального
Аноним 361 пишет: > Может кто знает, как определить в локальном классе адрес внешнего (без > явной его передачи в локальный класс)?
Адрес класса определить невозмножно. Потому что у класса не существует
адреса.
Если имелись в виду все же объекты класса, то объект вложенного
класса никак неявно не связан с объектом охватывающего его класса.
Это тебе не Java какая-нибудь. Это — нормальный язык программирования.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Определить адрес внешнего класса из локального
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>
не вложенный класс, а локальный, то есть находящийся внутри метода класса.
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, Вы писали:
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>>
не вложенный класс, а локальный, то есть находящийся внутри метода класса.
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.
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>>>
не вложенный класс, а локальный, то есть находящийся внутри метода класса.
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.
Да, если объектов не один, то придётся. Но, по-правде говоря, не пойму как это связано с моим вопросом.