Здравствуйте, Oleg A. Bachin, Вы писали:
OAB>Здравствуйте, Павел Кузнецов, Вы писали:
ПК>>Здравствуйте, Oleg, Вы писали:
OAB>>> вопрос такой: можно ли написать такой автоконструктор, который знал бы об OAB>>> экземпляре объекта в котором он создается?
OAB>>>
OAB>>> class B{
OAB>>> A a; //
OAB>>> }
OAB>>>
ПК>>Только если заранее известно, что объекты A всегда будут создаваться как члены B. ПК>>В этом случае можно пользоваться какими-нибудь платформенно-зависимыми штучками ПК>>для вычисления адреса полного объекта из адреса члена.
OAB>О! А можно поконкретнее... и сразу еще,платформо- или компиляторо- ? а может еще линкер вмешается?
OAB>допустим так, A всегда создается как екземпляр B (ну или Bxxx: public B). OAB>пусть даже (скорее всего так и будет) A — это простой (забыл как точно называется, вобщем тот который нормально передается по значению,
Расскажи подробнее про свою задачу. Может быть, существует какой-то изъян в дизайне.
Если дизайн поправить, так может задача сама собой разрешится.
Serge.
Hасколько проще была бы жизнь, если бы она была в исходниках.
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, Oleg A. Bachin, Вы писали:
B>
B>class B;
B>class A
B>{
B> B* pb_;
B>public:
B> A(B* pb = 0) : pb_(pb) {}
B>};
B>class B
B>{
B> A a;
B>public:
B> B() : a(this) {}
B>};
B>int main()
B>{
B> B b;
B>}
B>
Прошу прощения, но возможно я не правильно выразился...
Я имел ввиду под "автоконструктор" — это конструктор по-умолчанию.
Т.е. то, что Вы написали я прекрасно понимаю, но мне хотелось бы описать класс (написать макрос если такой возможен) при котором this передавался автоматически.
Здравствуйте, Oleg, Вы писали:
OAB> вопрос такой: можно ли написать такой автоконструктор, который знал бы об OAB> экземпляре объекта в котором он создается?
OAB>
OAB> class B{
OAB> A a; //
OAB> }
OAB>
Только если заранее известно, что объекты A всегда будут создаваться как члены B.
В этом случае можно пользоваться какими-нибудь платформенно-зависимыми штучками
для вычисления адреса полного объекта из адреса члена.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>Здравствуйте, Oleg, Вы писали:
OAB>> вопрос такой: можно ли написать такой автоконструктор, который знал бы об OAB>> экземпляре объекта в котором он создается?
OAB>>
OAB>> class B{
OAB>> A a; //
OAB>> }
OAB>>
ПК>Только если заранее известно, что объекты A всегда будут создаваться как члены B. ПК>В этом случае можно пользоваться какими-нибудь платформенно-зависимыми штучками ПК>для вычисления адреса полного объекта из адреса члена.
О! А можно поконкретнее... и сразу еще,платформо- или компиляторо- ? а может еще линкер вмешается?
допустим так, A всегда создается как екземпляр B (ну или Bxxx: public B).
пусть даже (скорее всего так и будет) A — это простой (забыл как точно называется, вобщем тот который нормально передается по значению,
class A{
_v int;
}
)
т.е. память для него будет зарезервирована в экземпляре класса B.
как в таком случае получить сам экземпляр? чуть усложним:
Здравствуйте, Oleg A. Bachin, Вы писали:
OAB>допустим так, A всегда создается как екземпляр B (ну или Bxxx: public B). OAB>пусть даже (скорее всего так и будет) A — это простой (забыл как точно называется, вобщем тот который нормально передается по значению, OAB>
OAB>class A{
OAB> _v int;
OAB>}
OAB>
OAB>) OAB>т.е. память для него будет зарезервирована в экземпляре класса B. OAB>как в таком случае получить сам экземпляр? чуть усложним: OAB>
OAB>class B{
OAB> A a1;
OAB> A a2;
OAB>}
OAB>
ну, например, так:
class B;
class A
{
int _v;
B* container;
public:
A() : container(_B::currentB) {}
};
//-------class _B
{
friend class A;
_B();
protected:
_B(B* pB) { currentB = pB; }
static B* currentB;
};
_B::currentB = NULL;
//-------class B: _B
{
A a1;
A a2;
B() : _B(this) { currentB = NULL; }
};
я думал о таком варинте — регистрироваться в статической переменной на время создания класса... и в задаче вроде как не предвидится дерева (в классе B не присутствует член типа B)... и потокобезопастность можно добавить (учитывая предыдущее ограничение дабы небыло неразрешимых блокировок)... но почему-то мне это не эстетично показалось... что скажете?
Здравствуйте, Oleg A. Bachin, Вы писали:
OAB>Здравствуйте, jazzer, Вы писали:
OAB>я думал о таком варинте — регистрироваться в статической переменной на время создания класса... и в задаче вроде как не предвидится дерева (в классе B не присутствует член типа B)... и потокобезопастность можно добавить (учитывая предыдущее ограничение дабы небыло неразрешимых блокировок)... но почему-то мне это не эстетично показалось... что скажете?
Если не присутствует в классе В, то просто передавай как параметр, и используй только в конструкторе.
От статической глобальной переменной откажись сразу.
V>Если не присутствует в классе В, то просто передавай как параметр, и используй только в конструкторе. V>От статической глобальной переменной откажись сразу.
не понял... можно на примере плиииз
честно говоря в голове крутятся свои не сформированные до конца идеи, поэтому не совсем понял что Вы хотели сказать...
Best regards,
Oleg A. Bachin
Re[4]: хитрый автоконструктор
От:
Аноним
Дата:
05.02.04 08:24
Оценка:
Здравствуйте, Sergeem, Вы писали:
S>Расскажи подробнее про свою задачу. Может быть, существует какой-то изъян в дизайне. S>Если дизайн поправить, так может задача сама собой разрешится.
Согласен, но задачи как таковой нет. Я просто экперементирую
Сейчас вот придумал себе задачку такого рода...
Просто пытаюсь изучить возможности С++ и как можно упрощать код, а значит уменьшать возможность описок.
типа:
class B{
A a1;
A a2;
...
B(): a1(0), a2(0){B::SomeFunc(a1); B::SomeFunc(a2); ... };
}
Хочу, чтобы для класса (группы классов) A функция B::SomeFunc вызывалась автоматически (дабы не забыть написать).
Так что в данном случае вопрос не дизайна, а скорее нужности. Ведь если для того чтобы все заработало мне прийдется пожертвовать скоростью, безопастностью или еще чем-то, тогда разумеется я сам откажусь от этой идеи
Здравствуйте, jazzer, Вы писали:
J>А конкретнее? Только одна эта функция? Или любая функция? функция статическая? когда именно вызывалась? J>ставь максимально конкретизированную задачу, иначе слишком много вариантов, а писать их все ломает, если честно
ОК!
class TestRecord: public DBSTEP::Record
{
protected:
public:
DBSTEP::int4_t id;
std::string name;
DBSTEP::int4_t level;