С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 5

Подскажите по классам в Visual Studio c++

21.12.2010, 17:49. Показов 1700. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.12.2010, 17:49
Ответы с готовыми решениями:

Visual Studio перестал показывать дополнения к классам
Не знаю куда правильно задать вопрос, но программирую я на C++. Вопрос по Visual Studio. Сломалась функция показа возможных методов для...

Проблема с работой в Visual Studio, я новичок, подскажите)
Помогите пожалуйста с Visual studio у меня такая проблема я пишу программу она выдает в моем коде такие то ошибки но не показывает где они...

Ребяята подскажите, у меня вопро по Visual studio
Подскажите для Visual Studio 2010 нужно что то устанавливать? Библиотека там.... потому что уу меня не запускается даже Hello world(((

7
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
21.12.2010, 18:00
Цитата Сообщение от uropyxa Посмотреть сообщение
раскидать в заголовочный файл и cpp
А вы в .cpp файле включали заголовок?
C++
1
#include "Matrix.h"
В заголовочном файле надо добавить защиту от повторной компиляции. MSVSC++ поддерживает
C++
1
#pragma once
.
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
В астрале
Эксперт С++
 Аватар для ForEveR
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
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
21.12.2010, 20:05
uropyxa, Его просто нету. До С++0x его и не будет. Он поддерживался только одним компилятором, каким точно не помню.
1
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
21.12.2010, 22:46
Как-то упустил из виду, что говорится про шаблоны.
Если есть Matrix.h и Matrix.cpp, есть "кривые" выходы.
1. Добавить в файл, использующий CMatric
C++
1
2
#include "Matrix.h"
#include "Matrix.cpp";
2. Добавить инклуд Matrix.cpp в конец Matrix.h
C++
1
2
3
4
  ...
}; // конец объявления класса
 
#include "Matrix.cpp"
;
3. Слить все в один файл Matrix.h. Удобнее всего.
1
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 5
22.12.2010, 19:36  [ТС]
помогло вот что: добавил в основную программу #include "Matrix.cpp" и компилируется.
Всем спасибо за советы!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.12.2010, 19:36
Помогаю со студенческими работами здесь

Что лучше Visual Studio или Builder C++ подскажите?
Что лучше Visual Studio или Builder C++ подскажите?

Замена Visual Studio 2015: подскажите, какие есть варианты
В общем, нужно скомпилировать проект который написан под VS2015. Скомпилить нужно в винде (32 и 64битный бинарник что б были) ...

Люди подскажите какой Microsoft Visual Studio 2010 вы используете?
Значит проблема такая поставил Microsoft Visual Studio 2010 Express. Очень многие коды не работают. Вообще в чем проблема. Может другую...

В коде возникли ошибки при переходе с Visual studio 2013 на Visual studio 2017
Добрый день, решил попробовать поменять свою 2013 студию на 2017 и заметил такую проблему, при открытии проектов 13 года и даже копирования...

Имеются ли отличия в компиляторах у сред разработки Visual Studio 2006 и Visual Studio 2015 ?
скажите а где найти среду 2006 года? или можно использовать 2015 год?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
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 считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru