Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: объявление функции  (Прочитано 17464 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
Mayor
Специалист

ru
Offline 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
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 06-01-2009 15:56 » 

Функцию откуда вызывать собираешься, только из t.cpp? И функция - метод класса? Тогда идиома Pimpl ("pointer to implementation") тебе в руки. В противном случае - непонятно, в чём замысел.
Записан
Mayor
Специалист

ru
Offline Offline

« Ответ #2 : 07-01-2009 05:45 » new

Функцию откуда вызывать собираешься, только из t.cpp? И функция - метод класса? Тогда идиома Pimpl ("pointer to implementation") тебе в руки. В противном случае - непонятно, в чём замысел.

да точно пимпл, подойдет, но он почему то не работает с шаблонами

wstring бесполезно что как класс, что как структуру объявлять
« Последнее редактирование: 07-01-2009 05:54 от Mayor » Записан

1n c0de we trust
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 07-01-2009 06:41 » 

дык
Код:
void func(void*const pv, const DWORD dwdSizeOfPar)
{
   
}

только за типом следить надо аккуратно , компилятор переложил это со своих на твои плечи )
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 07-01-2009 06:49 » 

почитал немного про энтот пимпл - суть не понял, для чего это вообще может понадобится, можно примеры ?
Записан

Mayor
Специалист

ru
Offline Offline

« Ответ #5 : 07-01-2009 07:11 » 

дык
Код:
void func(void*const pv, const DWORD dwdSizeOfPar)
{
   
}

только за типом следить надо аккуратно , компилятор переложил это со своих на твои плечи )

во первых, ты вместо указателя на константу, создал константный указатель на не константный объект
во вторых, желательно чтобы компилятор проверял передаваемые в фукнцию аргументы
Записан

1n c0de we trust
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #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
Специалист

ru
Offline Offline

« Ответ #7 : 07-01-2009 15:30 » 

че то у меня первое решение не сработало, ты чем компилил?

Записан

1n c0de we trust
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 07-01-2009 16:59 » 

Mayor1,
Цитата
во первых, ты вместо указателя на константу, создал константный указатель на не константный объект
так я ж не знаю, хочешь ты менять объект или нет ) Поэтому так.

Всё таки очень хочется ответ на вопрос
почитал немного про энтот пимпл - суть не понял, для чего это вообще может понадобится, можно примеры ?
Записан

Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 07-01-2009 21:38 » 

Алексей1153++, когда не надо в заголовок с объявлением класса показывать зависимости от заголовков, требующиеся для реализации каких-то внутренних заморочек, о которых пользователю класса знать не обязательно. Скажем, хранится специфический приватный член, который имеет тип, объявленный где-то ещё. Чтобы включать хедер с типом для этого члена (или его определение) не в .h, а только в .cpp, используют Pimpl. Словом, в данном случае это делается, чтобы внутренние зависимости не светились наружу.
« Последнее редактирование: 07-01-2009 21:41 от Вад » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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;
   }
}

?
Записан

Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 09-01-2009 09:49 » 

Алексей1153++, это оно и есть в одной из ипостасей Улыбаюсь Может служить как для сокрытия всей реализации под обёрткой (для простоты изменения реализации и уменьшения времени компиляции при внесении таких изменений, например), так и для отдельных полей класса - чтобы перестраховаться от небезопасных конструкторов, например.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 09-01-2009 09:58 » 

Вад, то есть на статику перейти всё равно тут нельзя ?

а так, как я написал - так я этим часто пользуюсь, но не знал, как называется )))
Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #13 : 09-01-2009 16:40 » 

че то у меня первое решение не сработало, ты чем компилил?

там мелкая ошибка Улыбаюсь
Записан

Странно всё это....
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 23-01-2009 12:11 » 

Алексей1153++, так ты его в блок public поставь.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #16 : 23-01-2009 12:44 » 

не надо, зачем ? ) Я про сабж
Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #17 : 23-01-2009 13:06 » 

Это я о...
Правда в том случае лучше, если класс superpupertype где то ещё не понадобится
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #18 : 24-01-2009 05:24 » 

так это будет уже не похоже на пимпл
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines