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, Супермодераторы



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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