lapulya
Молодой специалист
Offline
|
|
« Ответ #150 : 03-01-2010 11:17 » |
|
Алексей1153++, Дык я знаю разницу между виртуальным и не виртуальным деструктором, только к данному случаю то это какое отношение ты же пишешь аллокатор, если он хапает память (а он только это и делает ) и если в деструкторе он эту память освобождает (а именно так и будет), то пиши пропало... А "Ctrl-C" - это о чём ? У мну в студии нет такого сочетания ) это грохает прогу запущенную из комадной строки в консоли (типа когда ты ее запустил из студии)
|
|
|
Записан
|
С уважением Lapulya
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #151 : 03-01-2010 14:37 » |
|
ты же пишешь аллокатор, если он хапает память
Ну, то есть, в случае наследования он, конечно, что-то и захапает, только я же его мемберами то не пользуюсь. Так что, в Багдаде полная спокуха на этот счёт ) Ну я уже понял, что наследовать не надо, смысла нету, просто содрать из исходников код и переписать
|
|
|
Записан
|
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #152 : 03-01-2010 23:56 » |
|
Пушистый... я тебя ПОКУСАЮ!!! прочитай зачем нужен виртуальный деструктор!!! В Багдаде все плохо - места нет, все аллокатор, падла, сожрал, потому что пушистый не знает зачем нужен виртуальный деструктор!!!
|
|
|
Записан
|
С уважением Lapulya
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #153 : 04-01-2010 03:58 » |
|
Багдад мирно спит
|
|
|
Записан
|
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #154 : 04-01-2010 04:01 » |
|
Не еще нет )
|
|
|
Записан
|
С уважением Lapulya
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #155 : 08-01-2010 20:47 » |
|
Ну а всё-таки: насколько я понял по экспериментам, то когда вызывается метод вектора resize и происходит увеличение размера вектора, то конструктор типа элемента вектора вызывается один раз. А потом, так понимаю, содержимое этого "эталона" копируется в новые экземпляры. Так ? То есть, я к чему, если в конструкторе завести, к примеру, статический счётчик - он будет неправильно подсчитывать количество созданных экземпляров ?
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #156 : 08-01-2010 23:31 » |
|
Думаю, он в любом случае будет неправильно подсчитывать - потому что экземпляры в массе своей будут порождаться конструктором копирования, а если поставить счётчик и там - то будет весьма сложно определить, сколько экземпляров создаётся по делу, потому что при операциях над вектором значения также будут копироваться.
Насчёт механизма копирования вектора не уверен - надо смотреть исходники. По-моему, должен делаться realloc силами аллокатора, а вот как затем происходит копирование - подозреваю, с помощью копирующего конструктора. Боюсь соврать.
|
|
« Последнее редактирование: 08-01-2010 23:36 от Вад »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #157 : 09-01-2010 05:28 » |
|
Ну мне как бы счётчик и не нужен, я пытаюсь разобраться, сколько раз конструктор вызовется при увеличении вектора на N элементов
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #158 : 12-05-2010 09:31 » |
|
пытаюсь сделать такую вещь: имеется несколько структур, и нужно, чтобы они все были такого вида #pragma pack(push,1) struct s1 { union { struct { BYTE m_body7[7];//общий тел };
struct { //7 байтов структуры s1 BYTE by; WORD w; DWORD dwd; };
}; };
struct s2 { union { struct { BYTE m_body7[7];//общий тел };
struct { //7 байтов структуры s2 WORD wd1; WORD wd2; WORD wd3; BYTE by1; };
}; }; #pragma pack(pop)
пытаюсь зашаблонить: #pragma pack(push,1) template<typename T> union u_PutData { struct {BYTE m_body7[7];}; //общий тел struct :public T{}; //разные данные u_PutData() { ::memset(&m_body7,0,sizeof(m_body7)); } }; #pragma pack(pop)
но при определении конечных структурок не получается задать параметр T как безымянный, то есть так: struct s2:public u_PutData < struct //безымянная структура - хочу так!!! { WORD wd1; WORD wd2; WORD wd3; BYTE by1; }; >{};
как это сделать или сделать максимально похоже ?
|
|
« Последнее редактирование: 12-05-2010 09:34 от Алексей1153++ »
|
Записан
|
|
|
|
Вад
|
|
« Ответ #159 : 12-05-2010 10:20 » |
|
А почему ты так хочешь? В смысле, чего добиваешься - спрятать структуру? От кого? От этого зависит, что будет означать "сделать похоже". Кроме того, от union наследоваться не получится.
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #160 : 12-05-2010 13:24 » |
|
По-моему это бессмысленная затея с union. Достаточно: #include <iostream>
struct X { unsigned char x; };
template<class T> class U { private: T instance; public: unsigned char *getBody() { return reinterpret_cast<unsigned char *>(&this->instance); } T *operator->() { return &this->instance; } };
int main() { U<X> x; x->x = 'X'; std::cout << x->getBody()[0] << std::endl; return 0; }
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #161 : 12-05-2010 14:23 » |
|
Dimka, да, наверное так проще. Ещё в конструктор в дебаге добавлю контроль на размер в 7 байтов
Вад, да фигнёй, похоже, я страдаю ) Все структуры должны быть 7 байтов, содержимое же разное. Вот и хотел эту семёрку так обеспечить. Наследование не требуется
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #162 : 12-05-2010 14:27 » |
|
и всё же интересно - можно ли безымянную структуру как параметр шаблона передать ))
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #163 : 12-05-2010 14:46 » |
|
кстати, ещё проще можно сделать #pragma pack(push,1) union sX { BYTE m_body7[7];//общий тел
struct s1 { BYTE by; WORD w; DWORD dwd; }m_s1;
struct s2 { WORD wd1; WORD wd2; WORD wd3; BYTE by1; }m_s2; }; #pragma pack(pop)
|
|
« Последнее редактирование: 12-05-2010 17:52 от Алексей1153++ »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #164 : 01-08-2010 16:33 » |
|
для этих целей есть специальная инструкция, template class Dinamic<int>;
блин, ну не получается у меня всё равно шаблонный метод в файл реализации выпихнуть ( да что там в файл, даже в одном файле не хотит компилироваться (по крайней мере в 6-й студии) class A { public: template<typename T> int F(T t,int i); };
template<typename T> int A::F(T t,int i) { return 0; }
main() { A a; a.F("1",1); }
error C2893: Failed to specialize function template 'int __thiscall A::F(T,int)' With the following template arguments: 'char *' А вот в девятке безо всяких пинков - идеально выходит ) ------------------------------------------------- Хм, а вот тоже нифига не идеально. На этом простеньком примере всё ок, в на большом проекте заупрямился линкер - начал жаловаться на неразрешённые внешние элементы А вышеупомянутую инструкцию не могу понять, как применить - ведь у меня не класс, а функция шаблонная )))
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #165 : 03-08-2010 04:26 » |
|
Алексей1153++, давай договоримся, что "шестёрка" и C++ это разные вещи
|
|
|
Записан
|
Странно всё это....
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #166 : 03-08-2010 05:08 » |
|
Та речь не про шестёрку уже Но я победил при помощи промежуточной не шаблонной функции (нечто вроде специализации)
|
|
|
Записан
|
|
|
|
|