Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Явное воплощение шаблонной функции 
V
    Опции темы
azesmcar
Дата 29.7.2009, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(Brodyaga @  29.7.2009,  14:55 Найти цитируемый пост)
Чтобы подключать определения определённых классов в местах где они нужны и чтобы вместе с ними не подключалась каждый раз вся реализация.
Или если изменится чтото только в реализации, то придётся перекомпилировать и слинковать только её. 

Да (можно еще найти причины, но этой достаточно), а теперь смотри, добиться того, что ты описал в случае с шаблонами можно ТОЛЬКО ИСПОЛЬЗОВАВ ЭКСПОРТ ШАБЛОНОВ. Так зачем мучиться если все равно цель недостижима? Включив CPP файл инклудом ты желаемого не получишь все равно. Потому я и говорю, пиши в заголовочном файле.

Цитата(Brodyaga @  29.7.2009,  14:55 Найти цитируемый пост)
template ClassA* MyClass::MyFunc<ClassA>(ClassA* object);
template ClassB* MyClass::MyFunc<ClassB>(ClassB* object);

в файл myclass.cpp ?

Понимаешь, не нужна причина чтобы чего-то не делать, нужна причина чтобы делать. Назови мне причину, ты выполняешь определенные действия, для чего? что ты получаешь от этого? Затрудняешь чтение и сопровождение своей программы. Что ты получаешь взамен? Если назовешь себе хоть одну весомую причину - делай так.  smile 

Это сообщение отредактировал(а) azesmcar - 29.7.2009, 15:39
PM   Вверх
andrew_121
Дата 29.7.2009, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Brodyaga, Если кого-то цитируете, выделяйте текст, и нажимайте кнопочку "Быстрая цитата". Так как не понятно кого вы цитируете.


п.с.
Ощущение, что Brodyaga не способ решения ищет, а способ все усложнить.



--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Brodyaga
Дата 29.7.2009, 18:01 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: нет
Всего: 2



Цитата

Назови мне причину, ты выполняешь определенные действия, для чего? что ты получаешь от этого? Затрудняешь чтение и сопровождение своей программы. Что ты получаешь взамен?

Ну как же... Шаблон будет разделён на два файла h и cpp. где надо там я буду подкючать h файл. И не будет никакого инклуда cpp файла.
Тоесть всё как я и хотел но без файла myclassinst.cpp

Цитата

п.с.
Ощущение, что Brodyaga не способ решения ищет, а способ все усложнить.

smile)))))) Нет. Просто хочу понять почему другие варианты плохи.

Это сообщение отредактировал(а) Brodyaga - 29.7.2009, 18:24
PM MAIL   Вверх
azesmcar
Дата 29.7.2009, 19:56 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(Brodyaga @  29.7.2009,  18:01 Найти цитируемый пост)
Ну как же... Шаблон будет разделён на два файла h и cpp. где надо там я буду подкючать h файл. И не будет никакого инклуда cpp файла.
Тоесть всё как я и хотел но без файла myclassinst.cpp

Да, это вариант..и ты даже получишь желаемое, но за счет чего? Теперь каждый раз когда тебе нужно использовать шаблон для нового типа, придется лезть в файл и добавлять строку, а если ты хочешь использовать свой шаблон для типа, который не известен твоему cpp файлу? Дополнительно делать в него include. Так твой cpp файл скоро разрастется, а что если завтра ты решишь что твой шаблонный класс это шедевр созданный твоими собственными руками и ты решишь увековечить его в виде lib-ы. Как потом пользователи твоей библитеки будут использовать твой шаблонный класс со своими типами? Тут теряется мощь шаблонов в некотором смысле. Если это устраивает - пиши.
PM   Вверх
Леопольд
Дата 29.7.2009, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(Brodyaga @ 29.7.2009,  14:55)
Цитата

Почему лучше разносить определение и реализацию в разные файлы? Что это дает и почему так рекомендуется?

Чтобы подключать определения определённых классов в местах где они нужны и чтобы вместе с ними не подключалась каждый раз вся реализация.
Или если изменится чтото только в реализации, то придётся перекомпилировать и слинковать только её. Ну вообщем.. раздельная компиляция (Леопольд! ВНИМАНИЕ! smile)))))))

Судя по всему, этим твои знания о раздельной компиляции и ограничиваются . Это тоже самое, что сказать - "С++ это язык программирования, и он нужен для того чтобы писать на нём программы". Но если это всё что человек знает про С++, то программистом его назвать нельзя, не так ли? Мои вопросы тебе непонятны именно потому что ты не знаешь как именно работает раздельная компиляция, в том числе и с шаблонами. Я советую тебе, изучить этот вопрос, потому что если бы ты знал его, то не начал бы этот топик вообще smile

Вот ещё один "непонятный" примерчик того что ты не знаешь как работает линковка. Я предполагаю что ты не знаешь этого потому что ты ни на один "непонятный" вопрос до сих пор не ответил ничего вразумительного:

Почему не компилируется вот это?
header.h
Код

class Example{
public:
    void Foo();
};

void Example::Foo(){
}

first.cpp
Код

#include "first.h"

int main(void){
    Example obj;
    obj.Foo();
    return 0;
}

second.cpp
Код

#include "first.h"
// только #include, больше ничего нет


А вот это, почти тоже самое, компилируется без проблем.
header.h
Код

class Example{
public:
    inline void Foo();
};

void Example::Foo(){
}

first.cpp
Код

#include "first.h"

int main(void){
    Example obj;
    obj.Foo();
    return 0;
}

second.cpp
Код

#include "first.h"
// только #include, больше ничего нет


А вот это, тоже не компилируется
header.h
Код

class Example{
public:
    inline void Foo();
};

first.cpp
Код

#include "first.h"

int main(void){
    Example obj;
    obj.Foo();
    return 0;
 }

second.cpp
Код

#include "first.h"

void Example::Foo(){
}


Добавлено @ 21:12
Цитата(Brodyaga @ 29.7.2009,  18:01)
И не будет никакого инклуда cpp файла.

Этого вообще никогда не должно быть. Для этого есть *.h или, частенько, в случае с шаблонами, *.hpp

Это сообщение отредактировал(а) Леопольд - 29.7.2009, 21:16


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
mes
Дата 29.7.2009, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Леопольд @  29.7.2009,  20:05 Найти цитируемый пост)
или, частенько, в случае с шаблонами, *.hpp

шаблоны тут не при чем smile 
си - *.c и *.h
cpp - *.cpp *.hpp (ну а *.h им достались по наследству smile ) 



--------------------
PM MAIL WWW   Вверх
Brodyaga
Дата 30.7.2009, 06:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: нет
Всего: 2



Цитата

Судя по всему, этим твои знания о раздельной компиляции и ограничиваются .

Это что экзамен чтоли? я тебе должен сейчас всё рассказать, что знаю про раздельную компиляцию?

Цитата

Вот ещё один "непонятный" примерчик того что ты не знаешь как работает линковка. Я предполагаю что ты не знаешь этого потому что ты ни на один "непонятный" вопрос до сих пор не ответил ничего вразумительного

И не собираюсь отвечать. Даже читать твои этажи кода не хочу. Я тебе не собираюсь ничего доказывать о своих знаниях. Если хочешь обсудить раздельную компиляцию, создай отдельную тему.

Цитата

Да, это вариант..и ты даже получишь желаемое, но за счет чего? Теперь каждый раз когда тебе нужно использовать шаблон для нового типа, придется лезть в файл и добавлять строку, а если ты хочешь использовать свой шаблон для типа, который не известен твоему cpp файлу? Дополнительно делать в него include. Так твой cpp файл скоро разрастется, а что если завтра ты решишь что твой шаблонный класс это шедевр созданный твоими собственными руками и ты решишь увековечить его в виде lib-ы. Как потом пользователи твоей библитеки будут использовать твой шаблонный класс со своими типами? Тут теряется мощь шаблонов в некотором смысле. Если это устраивает - пиши.

Можно эти строки вынести в отдельный h. Ну вообщем-то я тебя понял, спасибо! Буду выбирать, что для меня лучше. +1! ;)
PM MAIL   Вверх
azesmcar
Дата 30.7.2009, 07:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(Brodyaga @  30.7.2009,  06:57 Найти цитируемый пост)
Можно эти строки вынести в отдельный h. 

Можно, но это ничего не даст...нет, тоесть даст, просто сгруппирует все это безобразие в одном файле, но проблем это не отменит.
PM   Вверх
Леопольд
Дата 30.7.2009, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(Brodyaga @ 30.7.2009,  06:57)
И не собираюсь отвечать. Даже читать твои этажи кода не хочу. Я тебе не собираюсь ничего доказывать о своих знаниях. Если хочешь обсудить раздельную компиляцию, создай отдельную тему.

Эти "этажи" настолько элементарны, что не заслужили такого названия smile Мне никаких доказательств не надо, я знаю достаточно о линковке, что-бы использовать её себе во благо, и у меня не возникает вопросов, почему же проект, из 30 файлов не компилируется. А вот у тебя они возникают. Это не мне, а тебе надо понять, что для тебя остались тёмные уголки... Это единственная цель, которую я преследовал.

Это сообщение отредактировал(а) Леопольд - 30.7.2009, 09:49


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Brodyaga
Дата 30.7.2009, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: нет
Всего: 2



Цитата

А вот у тебя они возникают.

И у меня не возникают. Всё прекрасно компилируется. Просто возник небольшой казус с шаблонами, так как определялись повторно конструктор и деструктор. А так всё норм, выслушал плюсы и минусы явного инстанцирования и полного включения. Далее обсуждать чтото в этой теме не намерен. 

Цитата

я знаю достаточно о линковке, что-бы использовать её себе во благо

Если тебе хочется показать всем насколько ты круто знаешь линковку, то для этого не нужно флудить о ней в этой теме и задавать мне вопросы. Просто напиши статейку и выложи её здесь. Думаю это на самом деле будет полезно, без шуток.
PM MAIL   Вверх
Леопольд
Дата 30.7.2009, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(Brodyaga @  30.7.2009,  09:52 Найти цитируемый пост)

Цитата(Леопольд @  30.7.2009,  08:59 Найти цитируемый пост)
А вот у тебя они возникают.

И у меня не возникают. Всё прекрасно компилируется.

Мне так показалось из твоих постов, но я не уверен в этом. Возможно, ты просто очень сильно не любишь отвечать на вопросы.

Цитата(Brodyaga @  30.7.2009,  09:52 Найти цитируемый пост)
Если тебе хочется показать всем насколько ты круто знаешь 

Я не бахвалился...  smile   Психологический трюк  smile  Однако, очевидно, что ты враждебно настроен. Воспринимаешь искажённо.

Добавлено через 7 минут и 6 секунд
Цитата(Brodyaga @  30.7.2009,  09:52 Найти цитируемый пост)
Просто возник небольшой казус с шаблонами ... то для этого не нужно флудить о ней в этой теме и задавать мне вопросы.

Дело в том, что я вижу непосредвенную связь между, линковкой и инстанцирванием шаблонов. Я задавал наводящие вопросы, но увы, всё зря...

Добавлено через 10 минут и 9 секунд
По шаблонам есть неплохая книга - "Шаблоны С++. Справочник разработчика". Местами тяжеловато написанно, но там раскрыто много вопросов.

Это сообщение отредактировал(а) Леопольд - 30.7.2009, 12:18


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Леопольд
Дата 30.7.2009, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(mes @ 29.7.2009,  23:54)
си - *.c и *.h
cpp - *.cpp *.hpp (ну а *.h им достались по наследству smile )

Я заметил, случайно (если мне вообще не показалось) что кое-кто в *.h держит всякие разные объявления + реализации inline функций (глобальные переменные не рассматриваю), соответственно в *.сpp определения не inline фукнций. 
static функции могут быть определенны в хидере только если это не члены класса (inline static тоже можно определить в хидере, в том числе, если функция - член класса)

В *.hpp шаблоны - реализация которых, как правило, находится там же, независимо от линковки. Мне это показалось удобным, и я делаю именно так smile

Это сообщение отредактировал(а) Леопольд - 30.7.2009, 15:48


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0563 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.