|
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 5
|
|
Подскажите по классам в Visual Studio c++21.12.2010, 17:49. Показов 1697. Ответов 7
Метки нет (Все метки)
Я новичек(). Проблема такая: допустим есть код, в котором объявлен класс матриц (CMatrix) как шаблон (template <class T>), с методами инициализации, заполения рандомом и перегрузкой операторов. Все ок. Все работает:
template <class T> class CMatrix { T **matr; int m_in, m_im; public: CMatrix(int, int); ~CMatrix(); void Init(); void InitRandom(); CMatrix<T> &operator + (CMatrix <T>&b); CMatrix<T> &operator - (CMatrix <T>&b); }; template <class T> CMatrix<T>::CMatrix(int n, int m) { m_in = n; m_im = m; matr = NULL; Init(); } template <class T> CMatrix<T>::~CMatrix() { } template <class T> void CMatrix<T>::Init() { if (matr == NULL) { matr = new T *[m_in]; for ( int i = 0; i < m_in; i ++) matr[i] = new T[m_im]; } } template <class T> void CMatrix<T>::InitRandom() { srand(time(NULL)); for (int i = 0; i < m_in; i++) for (int j = 0; j < m_im; j++) *(*(matr+i)+ j)= rand() % 10; } template <class T> CMatrix<T> &CMatrix<T>::operator + (CMatrix<T> &b) { CMatrix c(m_in, m_im); for (int i = 0; i < m_in; i++) for (int j = 0; j < m_im; j++) c.matr[i][j] = this->matr[i][j] + b.matr[i][j]; return c; } template <class T> CMatrix<T> &CMatrix<T>::operator - (CMatrix <T>&b) { CMatrix c(m_in, m_im); for (int i = 0; i < m_in; i++) for (int j = 0; j < m_im; j++) c.matr[i][j] = this->matr[i][j] - b.matr[i][j]; return c; } int main() { CMatrix <int> A(5,5); CMatrix <int> B(5,5); CMatrix <int> C(5,5); A.Init(); B.Init(); C.Init(); A.InitRandom(); B.InitRandom(); C.InitRandom(); C = A + B; return 0; } Но если добавить в проекте класс с++ и переместить объявление класс в header (Matrix.h): template <class T> class CMatrix { T **matr; int m_in, m_im; public: CMatrix(int, int); ~CMatrix(void); void Init(); void InitRandom(); CMatrix<T> &operator + (CMatrix <T>&b); CMatrix<T> &operator - (CMatrix <T>&b); }; А реализцию в cpp файл (Matrix.cpp): template <class T> CMatrix<T>::CMatrix(int n, int m) { m_in = n; m_im = m; matr = NULL; Init(); } template <class T> CMatrix<T>::~CMatrix(void) { } template <class T> void CMatrix<T>::Init() { if (matr == NULL) { matr = new T *[m_in]; for ( int i = 0; i < m_in; i ++) matr[i] = new T[m_im]; } } template <class T> void CMatrix<T>::InitRandom() { srand(time(NULL)); for (int i = 0; i < m_in; i++) for (int j = 0; j < m_im; j++) *(*(matr+i)+ j)= rand() % 10; } template <class T> CMatrix<T> &CMatrix<T>::operator + (CMatrix<T> &b) { CMatrix c(m_in, m_im); for (int i = 0; i < m_in; i++) for (int j = 0; j < m_im; j++) c.matr[i][j] = this->matr[i][j] + b.matr[i][j]; return c; } template <class T> CMatrix<T> &CMatrix<T>::operator - (CMatrix <T>&b) { CMatrix c(m_in, m_im); for (int i = 0; i < m_in; i++) for (int j = 0; j < m_im; j++) c.matr[i][j] = this->matr[i][j] - b.matr[i][j]; return c; } То в основной программе: #include "Matrix.h" int main() { CMatrix <int> A(5,5); CMatrix <int> B(5,5); CMatrix <int> C(5,5); A.Init(); B.Init(); C.Init(); A.InitRandom(); B.InitRandom(); C.InitRandom(); C = A + B; return 0; } не компилируется с ошибкой error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall CMatrix<int>::~CMatrix<int>(void)" (??1?$CMatrix@H@@QAE@XZ) в функции _wmain error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall CMatrix<int>::CMatrix<int>(int,int)" (??0?$CMatrix@H@@QAE@HH@Z) в функции _wmain Ошибка с констуктором и деструктором (как я догадываюсь). Если кто знает в чем проблема, подсакажите пжлста. Пробовал пример с msdn шаблона (работает , если одним файлом) также раскидать в заголовочный файл и cpp, в основной программе создать экзепляр, такая же ошибка.
0
|
|
| 21.12.2010, 17:49 | |
|
Ответы с готовыми решениями:
7
Visual Studio перестал показывать дополнения к классам Проблема с работой в Visual Studio, я новичок, подскажите) Ребяята подскажите, у меня вопро по Visual studio |
|
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
|
||||||||||||
| 21.12.2010, 18:00 | ||||||||||||
0
|
||||||||||||
|
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 5
|
|
| 21.12.2010, 18:26 [ТС] | |
|
Да нет, здесь я ошибиться не должен, это сдандартное консольное приложении win32 (visual studio express 2008), там через #include "StdAfx.h" (в нем уже #include "Matrix.h") все подключено, в .h файле есть #pragma once, это все компилятором предусмотрено (хотя и попробовал в cpp написать #include "Matrix.h"- не вышло все равно). я пробовал и пример другого шаблона (если писать просто одном файлом с основной программой, то компилируется, если раскидывать, то нет) .
0
|
|
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
| 21.12.2010, 19:05 | |
|
uropyxa, Нету экспорта шаблонов в С++ практически. Пишите в 1 файле. Или же в cpp файле с определением шаблонного класса должны быть все функции, включая главную.
1
|
|
|
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 5
|
|
| 21.12.2010, 19:59 [ТС] | |
|
ForEveR, спасибо. Не подскажите где в интернетах про экспорт шаблонов написано просто и четко?
0
|
|
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
| 21.12.2010, 20:05 | |
|
uropyxa, Его просто нету. До С++0x его и не будет. Он поддерживался только одним компилятором, каким точно не помню.
1
|
|
|
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
|
|||||||||||
| 21.12.2010, 22:46 | |||||||||||
|
Как-то упустил из виду, что говорится про шаблоны.
Если есть Matrix.h и Matrix.cpp, есть "кривые" выходы. 1. Добавить в файл, использующий CMatric
3. Слить все в один файл Matrix.h. Удобнее всего.
1
|
|||||||||||
|
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 5
|
|
| 22.12.2010, 19:36 [ТС] | |
|
помогло вот что: добавил в основную программу #include "Matrix.cpp" и компилируется.
Всем спасибо за советы!!!
0
|
|
| 22.12.2010, 19:36 | |
|
Помогаю со студенческими работами здесь
8
Что лучше Visual Studio или Builder C++ подскажите?
Люди подскажите какой Microsoft Visual Studio 2010 вы используете?
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/
O1rJuneU_ls
https:/ / vkvideo. ru/ video-115721503_456239114
|
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ВВЕДЕНИЕ
Введу сокращения:
аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
|
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi
ветка по-частям.
коммит Create переделка под биомассу. txt
вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
|
|
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ *
Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях.
Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её.
Последовательность действий:. . .
|
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
|
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение.
И на уровне агентов добавится между грибами или бактериями взаимодействий.
До того я пробовал подход через многомерные массивы,. . .
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|