![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
yorgan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 5.6.2008 Репутация: нет Всего: нет |
Всем привет.
Есть такое задание: Нужно написать шаблонный класс "матрица", в котором будет: 1. конструктор (матрица размером 10 на 20). 2. деструктор. 3. нахождение детерминанта матрицы (определителя). 4. нахождение обратной матрицы. 5. Вывод элемента [][]; 6. Умножение матрицы А на B. У меня такие вопросы: Как выделять в конструкторе память динимически под матрицу заданной размерности (соответственно как освобождать помять в деструкторе)? Как находить определитель матрицы (на сколько я понимаю это будет рекурсивная функция)? Если была бы матрица 3 на 3, я нашел бы без проблем, а вот 10 н 20... не знаю :( Вывод элемента... вот тут я не очень понял. Если просто написать функцию-член, которая будет по заданным [i][j] выводить на экран элемент, то это просто, а если нужо переопределить операцию [][]...??? Помогите пожалуйста. |
|||
|
||||
dragomir |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 28.1.2007 Где: Брянск Репутация: нет Всего: нет |
||||
|
||||
yorgan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 5.6.2008 Репутация: нет Всего: нет |
На сколько я помню курс линейной алгебры... методом Гаусса ищется корни СЛАУ (систем линейных алгебраических уравнений)
|
|||
|
||||
bronislav |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 334 Регистрация: 29.1.2008 Где: Украина::Донецк Репутация: 2 Всего: 3 |
Насколько я знаю можно найти (без до определения) только определитель квадратной матрицы. Посмотри тут. Добавлено через 35 секунд
Именно так Добавлено через 4 минуты и 2 секунды и тут -------------------- ![]() иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes |
|||
|
||||
IKM2007 |
|
||||
![]() Зима близко ![]() ![]() Профиль Группа: Участник Сообщений: 702 Регистрация: 26.4.2008 Где: olmedreca Репутация: 3 Всего: 40 |
На остальное нет ни идей,ни времени(Завтра экзамен). -------------------- "К чёрту обстоятельства, я создаю возможности." Брюс Ли |
||||
|
|||||
bronislav |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 334 Регистрация: 29.1.2008 Где: Украина::Донецк Репутация: 2 Всего: 3 |
Я бы рекомендовал размер матрицы задавать в параметрах конструктора. А их можно сделать со значениями по умолчанию, если тебе так нужен размер 10 x 20. -------------------- ![]() иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes |
|||
|
||||
bronislav |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 334 Регистрация: 29.1.2008 Где: Украина::Донецк Репутация: 2 Всего: 3 |
IKM2007,
Ключевое слово тут шаблонный. Например вот так:
А использовать так:
-------------------- ![]() иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes |
||||
|
|||||
Dmi3ev |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1698 Регистрация: 28.11.2007 Репутация: 13 Всего: 41 |
можно так создавать матрицу динамически, как вариант. а вообще не понятно зачем это делать, если размерность заранее известна? Добавлено через 1 минуту и 51 секунду а вот так если:
-------------------- |
||||
|
|||||
bronislav |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 334 Регистрация: 29.1.2008 Где: Украина::Донецк Репутация: 2 Всего: 3 |
А что если размерность заранее известна, то ее лучше в стеке создать? А если экземпляров класса будет 100-200. ИМХО такой подход не есть гуд. -------------------- ![]() иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes |
|||
|
||||
yorgan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 5.6.2008 Репутация: нет Всего: нет |
Пока писал, уже несколько людей ответили. Сейчас буду разбираться. Всем большое спасибо за желание помочь!!!
![]()
Да, вы правы. Сейчас еще посмотрел учебник по математике. Значит преподаватель ошибся. IKM2007, спасибо. Уже что-то... а то голова гудит, не знаю даже с чего начать. Тогда вопрос таков: как найти детерминант квадратной матрицы 10 на 10? Мне бы посмотреть на код, где вычисляется хотя бы определитель матрицы 4 на 4 (как я понял есть только один метод нахождения определителя матрицы N-го порядка - с помощью суммы произведений элементов некоторого ряда на соотвествующие им алгебраические дополнения). Это сообщение отредактировал(а) yorgan - 5.6.2008, 18:14 |
|||
|
||||
Dmi3ev |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1698 Регистрация: 28.11.2007 Репутация: 13 Всего: 41 |
ну если говорить о матрице 4*4, то тогда формула определителя такова:
det A=a11*(-1)^(1+1)*(det (та же матрица, только надо вычеркнуть строку и столбец где расположен a11))+ a12*(-1)^(1+2)*(det (та же матрица, только надо вычеркнуть строку и столбец где расположен a12))+ a13*(-1)^(1+3)*(det (та же матрица, только надо вычеркнуть строку и столбец где расположен a13))+ a14*(-1)^(1+4)*(det (та же матрица, только надо вычеркнуть строку и столбец где расположен a12)) а как считать определитель для матрицы 3*3, которая получается в скобках я написал в описании класса Matrix (метод Determ), я считал по правилу Саррюса Добавлено через 3 минуты и 44 секунды
вообще да, но если 10 на 20 и в массиве хранятся числа, а не большие боъекты , то, мне кажется, по барабану -------------------- |
|||
|
||||
bronislav |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 334 Регистрация: 29.1.2008 Где: Украина::Донецк Репутация: 2 Всего: 3 |
Мне кажется, что даже для небольших матриц это не хорошая практика ибо привыкнешь ![]() -------------------- ![]() иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes |
|||
|
||||
yorgan |
|
||||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 5.6.2008 Репутация: нет Всего: нет |
Функции нахождения детерминатна и обратной матрицы, ввода матриц и перемножения матриц:
У меня еще пока плохо с ООП в целом и с шаблонами в частности, может кто-то может подсказать как притулить эту функцию как метода класса к коду bronislav'а:
И если не сложно, то не могли бы объяснить что есть exception.h и почему такой синтаксис в этой строке: : rows( _rows ), cols( _cols )? Это сообщение отредактировал(а) yorgan - 5.6.2008, 23:39 |
||||
|
|||||
bronislav |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 334 Регистрация: 29.1.2008 Где: Украина::Донецк Репутация: 2 Всего: 3 |
Это код проводит инициализацию членов данных класса параметрами конструктора. Во первых просто exception без h. Это заголовочный файл про обработку исключений. Вопросы по обработке исключений уже много раз поднимались на форуме, воспользуйся поиском или посмотри вот в этой теме например. Добавлено через 1 минуту и 40 секунд Да и умножение и ввод матриц можно, даже скорее нужно реализовать через перегрузку операторов. -------------------- ![]() иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes |
|||
|
||||
yorgan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 5.6.2008 Репутация: нет Всего: нет |
Вот что-то навоял. Посмотрите пожалуйста в чем ошибки?
|
|||
|
||||
bronislav |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 334 Регистрация: 29.1.2008 Где: Украина::Донецк Репутация: 2 Всего: 3 |
Класс matrix описывает одну матрицу, а для работы с несколькими матрицами создается несколько экземпляров класса.
-------------------- ![]() иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes |
|||
|
||||
yorgan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 5.6.2008 Репутация: нет Всего: нет |
Как?
Не могу понять в чем именно ошибка... ООП практически не знаю :( |
|||
|
||||
bronislav |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 334 Регистрация: 29.1.2008 Где: Украина::Донецк Репутация: 2 Всего: 3 |
Зачем в классе 3 массива для матриц? Вам надо использовать 3 матрицы? Тогда переопределяем оператор умножения для класса matrix и умножаем матрицы так:
-------------------- ![]() иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes |
|||
|
||||
yorgan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 5.6.2008 Репутация: нет Всего: нет |
Это все, что не правильно в коде?
Матрицы три, т.к. нужно разные действия делать: умножать 2 матрицы друг на друга, результат помещать в третью. А как переопределить оператор умножения? |
|||
|
||||
bronislav |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 334 Регистрация: 29.1.2008 Где: Украина::Донецк Репутация: 2 Всего: 3 |
Вообще-то не мешало бы воспользоваться поиском на тему "Перегрузка операций"
И можно посмотреть тут. Это сообщение отредактировал(а) bronislav - 6.6.2008, 10:54 -------------------- ![]() иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes |
|||
|
||||
yorgan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 5.6.2008 Репутация: нет Всего: нет |
времени уже нету. Через 40 минут нужно уже выезжать в универ :(
P.s. в коде больше ошибок\неточностей нету? |
|||
|
||||
bronislav |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 334 Регистрация: 29.1.2008 Где: Украина::Донецк Репутация: 2 Всего: 3 |
Ну по аналогии с умножение надо переделать функции ввода и др. Добавлено через 1 минуту и 24 секунды Оно компилируется? Значит работает, но будь готов к тому, что преподаватель отрицательно отреагирует на такой код. -------------------- ![]() иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes |
|||
|
||||
yorgan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 5.6.2008 Репутация: нет Всего: нет |
Не компилится :(
Ругается на переменную i в каждой функции - типа много раз она уже объявлена. А вот обращение по [][] к элементу матрицы - преподаватлеь имел ввиду просто написать функцию, которая будет выводить элементы матрицы по указанным i и j или нужно переопределять операцию [][] ???? |
|||
|
||||
bsa |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Я бы порекомендовал в качестве параметров шаблона задавать еще и размерность матрицы:
1. автоматические матрицы занимают много места в стеке (а зачем много автоматических матриц?) Преимущества: 1. высокая скорость создания объекта 2. не надо заморачиваться с конструктором копирования 3. высокая скорость доступа к элементам (компилятор генерирует код оптимизированный под конкретные значения размерностей) 4. возможность написания легко оптимизируемых алгоритмов расчета определителя 5. возможность организации на стадии компиляции проверки на корректность арифметических операций (т.е. нельзя перемножить матрицу 4x4 на 3x3), как-то так:
|
||||
|
|||||
bronislav |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 334 Регистрация: 29.1.2008 Где: Украина::Донецк Репутация: 2 Всего: 3 |
![]() Это сообщение отредактировал(а) bronislav - 6.6.2008, 12:27 -------------------- ![]() иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes |
|||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 10 Всего: 33 |
yorgan: То что ты навоял - работает?
На всякий случай держи вот этот шаблон. Сам юзаю в проекте по разложению звука на спектр.
Так как шаблон выдран из проекта, возможны ошибки компиляции. Думаю ты разберешся... Удачи. Это сообщение отредактировал(а) andrew_121 - 6.6.2008, 15:07 Присоединённый файл ( Кол-во скачиваний: 6 ) ![]() -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 10 Всего: 33 |
Да, и еще...
Остальной функционал набросай сам. Методы все есть, теории в инете то же. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
yorgan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 5.6.2008 Репутация: нет Всего: нет |
Спасибо за помощь. Буду разбираться (нужно переопределить еще операцию умножения - для умножения матриц и взятие элемента через операцию [][] )
Преподватель спросил: а можно ли этот файл ( шаблонный класс "матрица") сделать библиотекой? Если нельзя, то почему? Это сообщение отредактировал(а) yorgan - 8.6.2008, 14:15 |
|||
|
||||
bronislav |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 334 Регистрация: 29.1.2008 Где: Украина::Донецк Репутация: 2 Всего: 3 |
Для каждого набора аргументов шаблона на этапе компиляции содается свой класс, который уже и обрабатывается компилятором.
Библиотекой сделать можно, НО при условии его не доступности вне библиотеки. Т.е. использование только для внутренних нужд. Возможно ошибаюсь. -------------------- ![]() иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes |
|||
|
||||
yorgan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 5.6.2008 Репутация: нет Всего: нет |
Вот код:
Вопрос по прежнему актуален. Можно ли сделать из него библиотеку matrix.lib ? А можно сделать из этого кода хеадер-файл matrix.h и уже из matrix.h и matrix.срр (где main) сделать matrix.lib? Кстати, а как делать библиотеку в Вижуал Студио 2005? Это сообщение отредактировал(а) yorgan - 8.6.2008, 21:06 |
|||
|
||||
bronislav |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 334 Регистрация: 29.1.2008 Где: Украина::Донецк Репутация: 2 Всего: 3 |
Это вопрос для отдельного топика
А как ты собораешься использовать такую библиотеку с main? -------------------- ![]() иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes |
|||
|
||||
yorgan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 5.6.2008 Репутация: нет Всего: нет |
Видимо вот в чем собака зарыта. Преподаватель задал вопрос таким образом: можно ли сделать matrix.lib из matrix.h и matrix.cpp (где мэйн), значит с мэйном точно нельзя. А просто из matrix.h можно?
|
|||
|
||||
bronislav |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 334 Регистрация: 29.1.2008 Где: Украина::Донецк Репутация: 2 Всего: 3 |
Только из заголовочного файла (.h) сделать библиотеку нельзя.
-------------------- ![]() иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes |
|||
|
||||
yorgan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 5.6.2008 Репутация: нет Всего: нет |
хм... тогда возникает закономерный вопрос)))
А что еще нужно, если *.срр-файл с мэйном использовать нельзя ? P.s. Код с шаблонным классом "матрица" можно сохранить как .cpp без мэна... Это сообщение отредактировал(а) yorgan - 8.6.2008, 21:51 |
|||
|
||||
rrrFer |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 208 Регистрация: 11.5.2008 Где: Красноярск Репутация: 0 Всего: 1 |
yorgan,
наверно надо выделить все функции, кроме main в отдельный .cpp ![]() Это сообщение отредактировал(а) rrrFer - 8.6.2008, 22:04 |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Для создания бинарной библиотеки (*.lib, *.a, *.dll, *.so) нужно создавать *.cpp файл. В него можно выделить только нешаблонные функции и методы нешаблонных классов.
Другими словами - из шаблонного класса бинарную библиотеку сделать нельзя, так как исходный код шаблона должен быть доступен во всех местах компиляции. С другой стороны, просто библиотеки сделать можно. Типичный пример - boost. Там далеко не все библиотеки имеют бинарные составляющие. |
|||
|
||||
yorgan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 5.6.2008 Репутация: нет Всего: нет |
||||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
На самом деле нужен не весь исходный код, а только используемая часть. Более того, даже она не обязательна (это уже тонкости, и тебе заморачиваться на них не стоит). Даже в стандарте С++ есть упоминание возможности создания бинарных библиотек шаблонов, но, на сколько мне известно, ни один популярный компилятор этого делать не умеет. Для того, чтобы ответить на этот вопрос нужно понимать, что такое шаблон. Шаблон - это программа этапа компиляции (т.е. ее выполняет компилятор), результатом работы которой является специализированная функция(класс), которая умеет работать только с указанными параметрами [шаблона] и ничем иным. Таких специализаций компилятор может нагородить кучу - по числу уникальных комбинаций параметров шаблона. Но чтобы ему создать специализацию шаблона, ему нужно иметь доступ к исходному тексту этого шаблона. Если шаблон - это класс, то должен быть доступ к тексту самого класса, а так же методов используемых в данном месте программы (методы, которые не используются в программе, проверяются только на синтаксические ошибки и более ни в чем не учавствуют). Пример на пальцах (тех кто понимает, просьба не пинать, но красивее ничего не придумал), у тебя есть текст, ты хочешь одно определенное слово заменить на другое, не зная полностью этого слова (или даже зная только первую и последную буквы) ты корректно выполнить операцию не сможешь. |
|||
|
||||
yorgan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 5.6.2008 Репутация: нет Всего: нет |
Извини за серость, а компилятор не имеет доступа к исходному тексту шаблона, если этот шаблон определен в библиотеке? |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 6 Всего: 162 |
Шаблон - это исходный код. Если библиотека не распространяется в исходных кодах, то шаблон в библиотеке определён быть не может. |
|||
|
||||
yorgan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 5.6.2008 Репутация: нет Всего: нет |
Что значит распространяется или не распространяется... Преподаватель задал такой вопрос: Можно ли из твоего шаблонного класса матрица сделать библиотеку "matrix.lib" и будет ли она работать при подключении к другому проекту? |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 6 Всего: 162 |
Бинарную - нет.
|
|||
|
||||
yorgan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 5.6.2008 Репутация: нет Всего: нет |
почему? Т.к.: Почему компилятор не имеет доступа к исходному тексту в бинарной библиотеке? А в какой библиотеке имеет доступ? Он что не может читать бинарные библиотеки или что? |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 6 Всего: 162 |
||||
|
||||
yorgan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 5.6.2008 Репутация: нет Всего: нет |
А какая разница описан ли шаблонный класс на языке С++ или в двоичном коде? А если создать бинарную библиотеку просто из класса (не шаблонного), то компилятор все хорошо будет читать и понимать?
|
|||
|
||||
fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 1 Всего: 1 |
а какая разница между типом int и переменной в памяти, которую создал компилятор с помощью типа int? 1. шаблон - это тип, передав определенные параметры в которй можно получить экземпляр объекта в памяти.. 2. информация о типе никогда не содержится в бинарном файле.. 3. экземпляр объекта - это двоичные данные в памяти (которые можно записать в двоичную библиотеку) 4. компилятор работает с исходным текстом, а процесс перевода (трансляции) из исходного текста в бинарный (машинный) код называется компиляцией.. исходя из выше сказанного ответь на свой вопрос сам.. -------------------- undefined |
|||
|
||||
yorgan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 5.6.2008 Репутация: нет Всего: нет |
хорошо...
Я так понял не только шаблонный, но и простой класс нельзя сделать библиотекой? Если да, то можно пример: что тогда можно сделать библиотекой? |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 6 Всего: 162 |
||||
|
||||
yorgan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 5.6.2008 Репутация: нет Всего: нет |
||||
|
||||
LavYaAll |
|
|||
![]() Шустрый ![]() Профиль Группа: Awaiting Authorisation Сообщений: 62 Регистрация: 1.5.2008 Репутация: 1 Всего: 1 |
yorgan,
Шаблон не компилируется, если не создан его экземпляр на основе какого-либо типа/класса. Компилятор его просто проигнорирует в этом случае. А это значит, что файл, полученный после компиляции не будет содержать информацию о шаблоне. Теперь ответь на вопрос. Как можно импортировать из библиотеки то, чего там нет? Можно. Потому что класс компилируется и заносится в файл, полученный после компиляции. И все же эти слова режут слух. Никто не делает класс библиотекой. Ты создаешь, к примеру, проект DLL(динамическая библиотека), а далее в нем описываешь класс, который при помощи директив __declspec(dllexport) или .DEF файла экспортируешь из этой библиотеки, если конечно хочешь. В библиотеке может быть сколько угодно классов. Да и не только классы могут быть, а еще и просто функции, переменные, ресурсы наконец. PS. Про библиотеки можно почитать детально в книге: Дж. Рихтер - Windows для профессионалов Создание эффективных Win32-приложений с учетом специфики 64-разрядной версии Windows Это сообщение отредактировал(а) LavYaAll - 14.6.2008, 19:41 |
|||
|
||||
bsa |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Видимо, ты не очень представляешь себе, что такое класс. Попробую объяснить на пальцах. Вот есть код:
|
||||||||
|
|||||||||
yorgan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 5.6.2008 Репутация: нет Всего: нет |
Вот попытался в Вижуал студио 2005 создать библиотеки. Делал библиотеки из шаблонного класса, обычного класса и просто библиотека, которая содержала в себе одну функцию, возводящую в квадрат число типа инт. Везде результат один и тот же, а именно 100 ошибок
![]() Вот видно все на скриншоте: ![]() http://dump.ru/file_catalog/650099 или http://slil.ru/25898509 Делал таким образом: Create Project в Start Page, далее в Project Types выбирал Visual C++: Win32 -> Win32 Consol Application. Далее Static Library и галочка только на Precompiled header. В проекте создавал один файл .cpp или .h куда помещал код класса (функции), и еще один файл .cpp, куда инклюдом подключал первый файл с кодом класса(функции). Библиотека компилилась без ошибок и предупреждений. Но во всех случаях результат один - ошибки типа "Error C2018 unkonwn character 0x10" или похожие... Что я не правильно делаю? |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 6 Всего: 162 |
Во-первых, далеко не обязательно делать скриншот - не у всех толстые инет-каналы. Достаточно скопировать текст.
Во-вторых, библиотеки не включаются директивой #include, они включаются в найстроках линковки проекта. |
|||
|
||||
LavYaAll |
|
|||
![]() Шустрый ![]() Профиль Группа: Awaiting Authorisation Сообщений: 62 Регистрация: 1.5.2008 Репутация: 1 Всего: 1 |
yorgan, если ты создал статическую библиотеку *.lib, то подключить ее можно через Project--->Add Existing Item---->(выбираешь файл статической библиотеки) Только не забудь в фильтре указать: "All files", чтоб отобразились все файлы папки.
Это сообщение отредактировал(а) LavYaAll - 16.6.2008, 08:10 |
|||
|
||||
yorgan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 5.6.2008 Репутация: нет Всего: нет |
Спасибо. Теперь работает.
|
|||
|
||||
yorgan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 5.6.2008 Репутация: нет Всего: нет |
Правильно ли я понял, что можно сделать так:
Запихать в хедер файл само описание шаблонного класса, а в *.lib его методы? и будет работать?) |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
нет. нельзя в lib файл запихать методы шаблонного класса. Они должны быть в заголовочном файле |
|||
|
||||
yorgan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 5.6.2008 Репутация: нет Всего: нет |
Т.е. единственное, что можно это сделать из шаблонного класса хедер файл?
У меня преподаватель спросил, а как тогда организовывается библиотека STL, если из шаблонных классов нельзя создать библиотеку? |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Из шаблонных классов нельзя создать БИНАРНУЮ библиотеку. А просто библиотека может поставляться и в виде набора заголовочных файлов (boost::spirit, например). Как вариант, можно найти нешаблонную часть твоего шаблона, выделить ее и поместить в cpp файл. Но это очень редко выходит. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |