Здравствуйте, V.I.P., Вы писали:
VIP>Здравствуйте, 0xDEADBEEF,
VIP>Я конечно благадорен тебе за помощь, но че орем то??
Ну... во-первых, я устал. Конец дня... и человек который долбит что у него задача.
Во-вторых твой ник. Very? Imbecilous? Pervert? Правильно?
И я устал. И долбит... В общем, не сдержался, в чем покорно прошу извинить.
VIP>я же знаю, может и есть другой подход, не через typyid, поэтому и спрашиваю
Впрочем, час за рулем — лучший транквилизатор. Я резко подобрел.
Вот тебе еще один подход.
created A::l (создался a)
----------------
created A::l (создание b в процессе...)
created B::l (создался b)
done...............
destroyed B::l (уничтожается b)
destroyed A::l (закончилось уничтожение b)
destroyed A::l (уничтожается a)
Как убирать "лишние" A::l рассказывать не буду. Подумай сам хорошенько.
__________
16.There is no cause so right that one cannot find a fool following it.
Здравствуйте, V.I.P., Вы писали:
VIP>Задача состоит в логировании событий, что бы определить имена наследуемых (созданных) классов, VIP>а в бызовом классе написать так чтобы при наследовании в лог писалось имя наследуемого класса
Воспользуйся фабрикой классов, но тогда классы придется создавать на фристоре.
Например, так:
VIP>и автоматически в лог запишется имя наследуемого класса
typeid.name() возвращает не имя, а строку, уникальную для каждого класса. Это две большие разницы.
Например: в Visual C для "A" выведется "A", а вот GCC на юнихе выдаст тебе (и выдает) что-то совершенно неудобочитаемое типа "1A"
__________
16.There is no cause so right that one cannot find a fool following it.
Здравствуйте, V.I.P., Вы писали:
VIP>Это все хорошо, но проблема в том, что конечные пользователи библеотекой протоколирования
Я уже говорил: в конструкторах typeid(*this) НЕ РАБОТАЕТ. Виртуальные функции тоже НЕ РАБОТАЮТ.
Таковы правила языка. То есть, твой подход НЕВЕРЕН. Ищи или другой подход или другой язык.
VIP>если захотят запротоколировать создание объектов, то каждый раз необходимо писать VIP>std::auto_ptr<A> a( TheFactory<A>() ); и так для каждого объекта
Этe запись можно достаточно сильно сократить, но общая идея остается той же.
VIP>а хотелось бы что то вроде того
а мне хотелось бы миллиард в швейцарском банке, большой пистолет, а также лицензию на отстрел нескольких огранизмов...
__________
16.There is no cause so right that one cannot find a fool following it.
Здравствуйте, подскачите пожалуйста
как узнать в базовом классе, имя класса наледуемого от него, т.е.
class A{
public:
A(){
using namespace std;
std::cout << typeid(*this).name() << "\n";
}
};
class B:public A{
};
int _tmain(int argc, _TCHAR* argv[])
{
A object1;
B object2;
getchar();
return 0;
}
выводит class A
class A
а хотелось бы class A
class В
что нужно дописать в конструкторе базового класса , что бы определялось имя наследуемого кдасса???
Здравствуйте, V.I.P., Вы писали:
VIP>что нужно дописать в конструкторе базового класса , что бы определялось имя наследуемого кдасса???
Тут скорее всего ничего не поможет.
Ну, во первых, базовый класс ничего, кроме собственного интерфейса, о производных знать не может.
Во вторых, при создании объекта класса A в рамках создания объекта класса B последнего просто еще не существует.
А если производных классов больше одного?
А зачем вообще это надо? Ведь при создании объекта обычными средствами тип все равно заранее известен.
Здравствуйте, V.I.P., Вы писали:
VIP>что нужно дописать в конструкторе базового класса ,
Ничего. Так работать заведомо не будет.
До тех пор, пока все конструкторы не отработали, класс считается несконструированным и не знает о своих потомках.
И,следовательно, в typeid() который ты написал, всегда будет возвращать "A".
VIP>что бы определялось имя наследуемого кдасса???
Заведи хотя бы одну виртуальную функцию.
Пример
struct A
{
virtual ~A()
{} //чтобы магия работалаvoid print()//а здесь виртуальности не надо совсем.
{
std::cout << typeid(*this).name() << "\n";
}
};
struct B: public A
{
};
int main()
{
A a; a.print();
B b; b.print();
}
__________
16.There is no cause so right that one cannot find a fool following it.
Здравствуйте, 0xDEADBEEF, Вы писали:
DEA>Здравствуйте, V.I.P., Вы писали:
VIP>>что нужно дописать в конструкторе базового класса , DEA>Ничего. Так работать заведомо не будет. DEA>До тех пор, пока все конструкторы не отработали, класс считается несконструированным и не знает о своих потомках. DEA>И,следовательно, в typeid() который ты написал, всегда будет возвращать "A".
VIP>>что бы определялось имя наследуемого кдасса??? DEA>Заведи хотя бы одну виртуальную функцию.
Задача состоит в логировании событий, что бы определить имена наследуемых (созданных) классов, а в бызовом классе
написать так чтобы при наследовании в лог писалось имя наследуемого класса
т.е. не вызавать b.print();
а просто написать B b; и автоматически в лог запишется имя наследуемого класса
Это все хорошо, но проблема в том, что конечные пользователи библеотекой протоколирования
если захотят запротоколировать создание объектов, то каждый раз необходимо писать
std::auto_ptr<A> a( TheFactory<A>() ); и так для каждого объекта
а хотелось бы что то вроде того
A(){
NEW_OBJECT();
//
}
где NEW_OBJECT(); макрос раскывающийся в Log.New_Object(){//заносим в лог "Создан Обект его имя ..."}