Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
uropyxa
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 5
21.12.2010, 17:49     Подскажите по классам в Visual Studio c++ #1
Я новичек(). Проблема такая: допустим есть код, в котором объявлен класс матриц (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, в основной программе создать экзепляр, такая же ошибка.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.12.2010, 17:49     Подскажите по классам в Visual Studio c++
Посмотрите здесь:

C++ Visual Studio
C++ Visual studio
Люди подскажите какой Microsoft Visual Studio 2010 вы используете? C++
C++ Visual Studio C++
Проблема с работой в Visual Studio, я новичок, подскажите) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
21.12.2010, 18:00     Подскажите по классам в Visual Studio c++ #2
Цитата Сообщение от uropyxa Посмотреть сообщение
раскидать в заголовочный файл и cpp
А вы в .cpp файле включали заголовок?
C++
1
#include "Matrix.h"
В заголовочном файле надо добавить защиту от повторной компиляции. MSVSC++ поддерживает
C++
1
#pragma once
.
uropyxa
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 5
21.12.2010, 18:26  [ТС]     Подскажите по классам в Visual Studio c++ #3
Да нет, здесь я ошибиться не должен, это сдандартное консольное приложении win32 (visual studio express 2008), там через #include "StdAfx.h" (в нем уже #include "Matrix.h") все подключено, в .h файле есть #pragma once, это все компилятором предусмотрено (хотя и попробовал в cpp написать #include "Matrix.h"- не вышло все равно). я пробовал и пример другого шаблона (если писать просто одном файлом с основной программой, то компилируется, если раскидывать, то нет) .
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
21.12.2010, 19:05     Подскажите по классам в Visual Studio c++ #4
uropyxa, Нету экспорта шаблонов в С++ практически. Пишите в 1 файле. Или же в cpp файле с определением шаблонного класса должны быть все функции, включая главную.
uropyxa
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 5
21.12.2010, 19:59  [ТС]     Подскажите по классам в Visual Studio c++ #5
ForEveR, спасибо. Не подскажите где в интернетах про экспорт шаблонов написано просто и четко?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
21.12.2010, 20:05     Подскажите по классам в Visual Studio c++ #6
uropyxa, Его просто нету. До С++0x его и не будет. Он поддерживался только одним компилятором, каким точно не помню.
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
21.12.2010, 22:46     Подскажите по классам в Visual Studio c++ #7
Как-то упустил из виду, что говорится про шаблоны.
Если есть 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. Удобнее всего.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2010, 19:36     Подскажите по классам в Visual Studio c++
Еще ссылки по теме:

Подскажите сайт с уроками по OpenGL для Visual Studio 2010 Express C++
Ребяята подскажите, у меня вопро по Visual studio C++
C++ Visual Studio перестал показывать дополнения к классам

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

Или воспользуйтесь поиском по форуму:
uropyxa
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 5
22.12.2010, 19:36  [ТС]     Подскажите по классам в Visual Studio c++ #8
помогло вот что: добавил в основную программу #include "Matrix.cpp" и компилируется.
Всем спасибо за советы!!!
Yandex
Объявления
22.12.2010, 19:36     Подскажите по классам в Visual Studio c++
Ответ Создать тему
Опции темы

Текущее время: 19:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru