Mayor
Специалист
Offline
|
|
« : 06-01-2009 15:45 » |
|
объявление функции как объявить функцию, у которой нет четкого определения ее аргументов? пример: t.h : func(const wstring& ); t.cpp #include <string> using std::wstring; func(const wstring& s) { ... };
* string должно инклудиться в сpp, а не в хидере, компилятору то поидее пофигу указатель на что передавать
|
|
|
Записан
|
1n c0de we trust
|
|
|
Вад
|
|
« Ответ #1 : 06-01-2009 15:56 » |
|
Функцию откуда вызывать собираешься, только из t.cpp? И функция - метод класса? Тогда идиома Pimpl ("pointer to implementation") тебе в руки. В противном случае - непонятно, в чём замысел.
|
|
|
Записан
|
|
|
|
Mayor
Специалист
Offline
|
|
« Ответ #2 : 07-01-2009 05:45 » |
|
Функцию откуда вызывать собираешься, только из t.cpp? И функция - метод класса? Тогда идиома Pimpl ("pointer to implementation") тебе в руки. В противном случае - непонятно, в чём замысел.
да точно пимпл, подойдет, но он почему то не работает с шаблонами wstring бесполезно что как класс, что как структуру объявлять
|
|
« Последнее редактирование: 07-01-2009 05:54 от Mayor »
|
Записан
|
1n c0de we trust
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #3 : 07-01-2009 06:41 » |
|
дык void func(void*const pv, const DWORD dwdSizeOfPar) { }
только за типом следить надо аккуратно , компилятор переложил это со своих на твои плечи )
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #4 : 07-01-2009 06:49 » |
|
почитал немного про энтот пимпл - суть не понял, для чего это вообще может понадобится, можно примеры ?
|
|
|
Записан
|
|
|
|
Mayor
Специалист
Offline
|
|
« Ответ #5 : 07-01-2009 07:11 » |
|
дык void func(void*const pv, const DWORD dwdSizeOfPar) { }
только за типом следить надо аккуратно , компилятор переложил это со своих на твои плечи ) во первых, ты вместо указателя на константу, создал константный указатель на не константный объект во вторых, желательно чтобы компилятор проверял передаваемые в фукнцию аргументы
|
|
|
Записан
|
1n c0de we trust
|
|
|
Антон (LogRus)
|
|
« Ответ #6 : 07-01-2009 09:26 » |
|
объявление функции как объявить функцию, у которой нет четкого определения ее аргументов? пример: t.h : func(const wstring& ); t.cpp #include <string> using std::wstring; func(const wstring& s) { ... };
* string должно инклудиться в сpp, а не в хидере, компилятору то поидее пофигу указатель на что передавать решение 1: t.h : namespace std { class wstring; } func(const wstring& ); t.cpp #include <string> func(const std::wstring& s) { ... };
решение 2: t.h : template <class T> func(const T& ); t.cpp #include <string> template<> func(const std::wstring& s) { ... }; /* незабываем сделать явное инстанцирование*/
но я бы выбрал решение 3 а именно в хердере написать func(const std::wstring& s);
а уж кто будет включать этот хедер пускай передним включит string
|
|
|
Записан
|
Странно всё это....
|
|
|
Mayor
Специалист
Offline
|
|
« Ответ #7 : 07-01-2009 15:30 » |
|
че то у меня первое решение не сработало, ты чем компилил?
|
|
|
Записан
|
1n c0de we trust
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #8 : 07-01-2009 16:59 » |
|
Mayor1, во первых, ты вместо указателя на константу, создал константный указатель на не константный объект
так я ж не знаю, хочешь ты менять объект или нет ) Поэтому так. Всё таки очень хочется ответ на вопрос почитал немного про энтот пимпл - суть не понял, для чего это вообще может понадобится, можно примеры ?
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #9 : 07-01-2009 21:38 » |
|
Алексей1153++, когда не надо в заголовок с объявлением класса показывать зависимости от заголовков, требующиеся для реализации каких-то внутренних заморочек, о которых пользователю класса знать не обязательно. Скажем, хранится специфический приватный член, который имеет тип, объявленный где-то ещё. Чтобы включать хедер с типом для этого члена (или его определение) не в .h, а только в .cpp, используют Pimpl. Словом, в данном случае это делается, чтобы внутренние зависимости не светились наружу.
|
|
« Последнее редактирование: 07-01-2009 21:41 от Вад »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #10 : 08-01-2009 05:56 » |
|
то есть это статический аналог вот этого: xxxx.h : class superpupertype; class xxxx { superpupertype* m_p;
xxxx(); ~xxxx(); };
xxxx.cpp : #include "superpupertype.h"
xxxx::xxxx() { m_p=new superpupertype; }
xxxx::~xxxx() { if(m_p) { delete m_p; m_p=0; } }
?
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #11 : 09-01-2009 09:49 » |
|
Алексей1153++, это оно и есть в одной из ипостасей Может служить как для сокрытия всей реализации под обёрткой (для простоты изменения реализации и уменьшения времени компиляции при внесении таких изменений, например), так и для отдельных полей класса - чтобы перестраховаться от небезопасных конструкторов, например.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #12 : 09-01-2009 09:58 » |
|
Вад, то есть на статику перейти всё равно тут нельзя ?
а так, как я написал - так я этим часто пользуюсь, но не знал, как называется )))
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #13 : 09-01-2009 16:40 » |
|
че то у меня первое решение не сработало, ты чем компилил?
там мелкая ошибка
|
|
|
Записан
|
Странно всё это....
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #14 : 23-01-2009 09:54 » |
|
а вот такая мысль посетила: xxxx.h : class xxxx { class superpupertype { ... };
superpupertype m_1;
public: xxxx(); ~xxxx(); };
xxxx.cpp : xxxx::xxxx() { //m_1 }
xxxx::~xxxx() { }
так же гораздо проще и никакой динамики Правда в том случае лучше, если класс superpupertype где то ещё не понадобится
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #15 : 23-01-2009 12:11 » |
|
Алексей1153++, так ты его в блок public поставь.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #16 : 23-01-2009 12:44 » |
|
не надо, зачем ? ) Я про сабж
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #17 : 23-01-2009 13:06 » |
|
Это я о... Правда в том случае лучше, если класс superpupertype где то ещё не понадобится
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #18 : 24-01-2009 05:24 » |
|
так это будет уже не похоже на пимпл
|
|
|
Записан
|
|
|
|
|