Klasa macierz i operator = (chyba)

0

Witam
Mam sobie klasę macierz, która wygląda mniej więcej tak

template<typename T>
class Matrix
{
public:
	
	Matrix();
	~Matrix();
	Matrix(int rows,int cols);
	Matrix(int rows,int cols, int defaultValue);
	Matrix(int rows, int cols, vector<vector<T>> dataVector);
	vector<vector<T>> GetDataVector();
	vector<T>& operator [](int index);

private:
	vector<vector<T>>  datavector;
	int columns,rows;
 

Jaki operator powinienem przeciążyć i w jaki sposób abym mógł wstawiać elementy maierzy poprzez operator =
Chodzi mi o wykonanie czegoś takiego

Matrix<double>* matrix = new Matrix(2,2) //tworzymy nowa macierz dwa na dwa
matrix[0][0] = 1;
matrix[0][1] = 1;
matrix[1][0] = 1;
matrix[1][1] = 1;

Jest w ogóle taka możliwość ??

0

@Carlos Spicy-Weener czytaj uważnie posty, bo pytanie wcale aż takie oczywiste nie jest ;)
Skoro chcesz robić [X] na obiekcie to powinieneś przeładować operator[]

0

Pamiętaj, że każdy operator jest metodą. Takie złożenie dwóch [][] jest wywołaniem dwóch metod. Oznacza to, że pierwszy operator powinien coś zwrócić. Zwrócenie całego wektora będzie kiepskim rozwiązaniem (ot choćby rozwala to hermetyzację). Najlepszym rozwiązaniem będzie przeciążenie operatora nawiasów okrągłych.

0

Mam przeładowany [] i zwracam cały wektor, jednak coś nie śmiga przypisanie takie obiekt[0][0] = 1;

0

trochę okroiłem ci klasę bo nie chciało mi się całości implementować, ale tak jak to robisz (zwracanie wektora) działa bez problemu:

#include <vector>
#include <iostream>

using namespace std;


template<typename T>
class Matrix
{
public:
        vector<vector<T> >  datavector;
        static const int SAJZ = 3;

        Matrix()
           : datavector(SAJZ)
        {
           for (int j=0;j<SAJZ;j++)
             for (int i=0;i<SAJZ;i++)
             {
                datavector[j].push_back(j*SAJZ + i);
             }
        }

        vector<T>& operator [](int index)
        {
           return datavector[index];
        }
};


template<typename T>
ostream& operator << (ostream& out, const Matrix<T>& m)
{
  for (int j=0;j<m.SAJZ;j++)
  {
    for (int i=0;i<m.SAJZ;i++)
      out<<m.datavector[j][i]<<"  ";
    out<<endl;
  }
  return out;
}


int main()
{
   Matrix<int> m;
   cout<<m;
   cout<<endl;
   m[1][1] = -1;
   cout<<m;
}
0

Ok jednak działa, po prostu źle wywoływałem operator.
Po prostu tworząc obiekt przez new

Matrix<double>* matrix = new Matrix(2,2) 

powinienem użyć operatora [] w taki sposób

(*matrix)[0][0] = 2;
 

Problem mam natomiast z operatorem << przeładowałem go w taki sposób jak to zrobił użytkownik Azarien
Jednak dostaje błędy linkera

Error 1 error LNK2028: unresolved token (0A00016E) "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class Matrix<double> &)" (??6@$$FYAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@AAV?$Matrix@N@@@Z) referenced in function "int __cdecl wmain(int,wchar_t * * const)" (?wmain@@$$HYAHHQAPA_W@Z)

Operator ten chciałem wywołac poprzez

cout << *matrix;

Gdzie zmienna matrix została stworznona poprzez

cout << Matrix<double> * matrix = new Matrix(2,2);

Co może być przyczyną ??

0

Pokaż kod, bo mnie działa.

0
template<typename T>
class Matrix
{
public:
 
        Matrix();
        ~Matrix();
        Matrix(int rows,int cols);
        Matrix(int rows,int cols, int defaultValue);
        Matrix(int rows, int cols, vector<vector<T>> dataVector);
       friend ostream & operator<<( ostream &out, Matrix<T>& matrix);

//...
//...
//...
 template<typename T>
 ostream& operator << (ostream& out, const Matrix<T>& m)
 {
	 for (int j=0;j<m.GetRows();j++)
	 {
		 for (int i=0;i<m.GetColumns();i++)
			 out<<m.GetDataVector[i][j];
		 out<<endl;
	 }
	 return out;
 }


 

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.