2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Реализация конструктора копии С++
Сообщение22.07.2015, 15:23 


22/07/15
3
Всем привет.
Пытаюсь для "набития руки" реализовать класс matrix. При попытке реализации конструктора копии возникают ошибки:
"1)Error 1 error LNK2019: unresolved external symbol "class Matrix<int> __cdecl Test(class Matrix<int>)" (?Test@@YA?AV?$Matrix@H@@V1@@Z) referenced in function _wmain F:\Learning\KNU\C++\Разбор полетов\classMatrix\ClassMatrix\ClassMatrix\ClassMatrix.obj ClassMatrix
2)Error 2 error LNK1120: 1 unresolved externals F:\Learning\KNU\C++\Разбор полетов\classMatrix\ClassMatrix\Debug\ClassMatrix.exe 1 1 ClassMatrix".
Заранее спасибо.

Код:
#include "stdafx.h"
#include <iostream>
#include <locale>
using namespace std;

template <class T> class Matrix {
   int Row;
   int Colum;
   T** p;
public:
   Matrix(int n, int m);
   Matrix(const Matrix &ob);
   friend Matrix Test(Matrix value);
   friend Matrix operator+(Matrix op1, Matrix op2); //в данный момент не реализуется
   int GetRow(){ return Row; }
   int GetColum(){ return Colum; }
   ~Matrix()
   {
      cout << "Удаление объекта" << endl;
      for (register int j = 0; j < Row; j++)
         delete[]p[j];
      delete[]p;
   }
   void Set()
   {
      for (register int i = 0; i < Row; i++)
         for (register int j = 0; j < Colum; j++)
            cin >> p[i][j];
   }

   void Show()
   {

      for (register int i = 0; i < Row; i++)
      {
         for (register int j = 0; j < Colum; j++)
            cout << p[i][j] << " ";
         cout << endl;
      }
      
   }
   
   
   
};

template < class T >
Matrix<T>::Matrix(int n, int m)
{
   cout << "Создание объекта" << endl;
   Row = n;
   Colum = m;
   p = new T*[n];
   for (register int i = 0; i < n; i++)
   {
      p[i] = new T[m];
   }

}

template < class T >
Matrix<T>::Matrix(const Matrix<T> &obj)
{
   cout << "Создание объекта копии" << endl;
   Row = obj.Row;
   Colum = obj.Colum;
   
   p=new T* [Row];
   for (register int i = 0; i < Row; i++)
      p[i] = new T[Colum];
   

}


template <class T>
Matrix<T> Test(Matrix<T> value)
{

   return value;
}

int _tmain(int argc, _TCHAR* argv[])
{
   setlocale(LC_ALL, "Russian");
   Matrix<int> value(2, 2);
   value.Set();
   value.Show();
   Test(value);
   system("pause");
   return 0;
}

 Профиль  
                  
 
 Re: Реализация конструктора копии С++
Сообщение22.07.2015, 15:55 
Заслуженный участник


04/05/09
4582
Я думаю проблема во friend объявлении. Компилятор понял его не как темплейт (далее написанный), а как простую функцию. Простая функция имеет преимущество перед темплейтом при вызове, так что из main() вызывается она, а самой функции нет.

-- Ср июл 22, 2015 09:02:01 --

Добавьте форвард объявления перед Matrix:
Код:
template <class T> class Matrix;
template <class T> Matrix<T> Test(Matrix<T> value);
template <class T> Matrix<T> operator+(Matrix<T> op1, Matrix<T> op2);

а в классе к friend добавьте <>:
Код:
    friend Matrix Test<>(Matrix value);
    friend Matrix operator+<>(Matrix op1, Matrix op2);


-- Ср июл 22, 2015 09:04:48 --

Кстати, если написали конструктор копирования, до должен быть и оператор присваивания.
И перестаньте писать register - он давно уже компиляторами игнорируется.

 Профиль  
                  
 
 Re: Реализация конструктора копии С++
Сообщение22.07.2015, 16:20 


22/07/15
3
Видоизмененный код. Запустилось. Проблема была в объявлении функции-друга, как мне и подсказали. Спасибо большое за помощь!
Код:
#include "stdafx.h"
#include <iostream>
#include <locale>
using namespace std;

template <class T> class Matrix {
   int Row;
   int Colum;
   T** p;
public:
   Matrix(int n, int m);
   Matrix(const Matrix &ob);
   
   template <class U> friend Matrix<U> test(Matrix <U> obj);
   
   int GetRow(){ return Row; }
   int GetColum(){ return Colum; }
   ~Matrix()
   {
      cout << "Удаление объекта" << endl;
      for (register int j = 0; j < Row; j++)
         delete[]p[j];
      delete[]p;
   }
   void Set()
   {
      for (register int i = 0; i < Row; i++)
         for (register int j = 0; j < Colum; j++)
            cin >> p[i][j];
   }

   void Show()
   {

      for (register int i = 0; i < Row; i++)
      {
         for (register int j = 0; j < Colum; j++)
            cout << p[i][j] << " ";
         cout << endl;
      }
      
   }
   
   
   
};

template < class T >
Matrix<T>::Matrix(int n, int m)
{
   cout << "Создание объекта" << endl;
   Row = n;
   Colum = m;
   p = new T*[n];
   for (register int i = 0; i < n; i++)
   {
      p[i] = new T[m];
   }

}

template < class T > Matrix<T>::Matrix(const Matrix<T> &obj)
{
   cout << "Создание объекта копии" << endl;
   Row = obj.Row;
   Colum = obj.Colum;
   
   p=new T* [Row];
   for (register int i = 0; i < Row; i++)
      p[i] = new T[Colum];
   

}


template <class T>
Matrix<T> Test(Matrix<T> value)
{

   return value;
}

int _tmain(int argc, _TCHAR* argv[])
{
   setlocale(LC_ALL, "Russian");
   Matrix<int> value(2, 2);
   value.Set();
   value.Show();
   Test(value);
   system("pause");
   return 0;
}

 Профиль  
                  
 
 Re: Реализация конструктора копии С++
Сообщение22.07.2015, 16:24 
Заслуженный участник


04/05/09
4582
Теперь test с маленькой буквы. Не совсем то, что вы хотели.

 Профиль  
                  
 
 Re: Реализация конструктора копии С++
Сообщение22.07.2015, 23:11 


22/07/15
3
Хм... Замена test на Test не вызвала никаких проблем - все как выполнялось, так и выполняется. Но спасибо за совет проверить.

 Профиль  
                  
 
 Re: Реализация конструктора копии С++
Сообщение23.07.2015, 00:40 
Заслуженный участник


04/05/09
4582
Serhiy380 в сообщении #1039653 писал(а):
Хм... Замена test на Test не вызвала никаких проблем - все как выполнялось, так и выполняется.
Это потому что пока Test() ничего не делает, что требует friend доступа. Она просто работала как не-friend функция.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: Mikhail_K


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group