Перегрузка оператора ^ с++

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by modsonic, 16 May 2011.

  1. modsonic

    modsonic New Member

    Joined:
    22 Dec 2009
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    Здравствуйте! Необходимо перегрузить бинарный оператор ^ для транспонирования матрицы. Есть класс матрицы:
    Код C++
    Code:
    template <class T>
    class Matrix {
            T** values;
            size_t rows;
            size_t cols;
    public:
            Matrix(size_t rows, size_t cols) {
                    if (rows * cols == 0)
                            return;
     
                    this->rows = rows;
                    this->cols = cols;
     
                    values = new T* [rows];
                    for (size_t i = 0; i < rows; i++) {
                            values[i] = new T [cols];
                            memset(values[i], 0, cols*sizeof(T));
                    }
            }
    }
    
    Пытаюсь перегрузить так:

    Code:
    T* operator ^(T &values){       
                    trans = new T* [cols];
                    for (size_t i = 0; i < cols; i++) 
                            trans[i] = new T [rows];
                    for (int i = 0; i < rows; i++)
                            for (int j = 0; j < cols; j++)
                            {
                                    if(i == j)
                                            continue;
                                    trans[j][i] = values[i][j];
                            }
     
                            return trans;
            }
    
    Вызываю так:

    Code:
    Matrix<int> Matr(Rows, Cols);
    ...
    Matr^Matr;// в данном месте ошибка
    

    Никак не могу понять в чем дело. Пожалуйста, подскажите как это реализовать.
     
  2. edge911

    edge911 Active Member

    Joined:
    21 Feb 2009
    Messages:
    105
    Likes Received:
    142
    Reputations:
    15
    ты передаешь как аргумент адрес на объект класса Matrix:
    Code:
        Matrix<int> Matr(4, 4);
        Matr^Matr; //<<
    
    хотя сам написал
    Code:
    T* operator ^(T &values)
    {
        ///  
    }
    ...
    
    то есть по твоему получается как то так:
    Code:
        int r = 5;
        Matr^(r);
    
    и в перегруженном операторе ^ пишешь:
    Code:
    T* operator ^(T &values)
    {
    ....
        trans[j][i] = values[i][j]; // <<
    ....
    }
    
    но ведь Matrix - не матрица и оператор [] не перегружен
    -------------------------
    мб ты это имел ввиду:
    Code:
    		T** operator^(Matrix<T> &M)
    		{       
    			
                    T **trans = new T* [cols];
                    for (size_t i = 0; i < cols; i++) 
                            trans[i] = new T [rows];
                    for (int i = 0; i < rows; i++)
                            for (int j = 0; j < cols; j++)
                            {
                                    if(i == j)
                                            continue;
                                    trans[j][i] = M.values[i][j];
                            }
    			
                            return trans;
    		}
    
    Code:
            Matrix<int> Matr(4, 4);
    	Matr^(Matr);
    
     
    #2 edge911, 16 May 2011
    Last edited: 16 May 2011
  3. modsonic

    modsonic New Member

    Joined:
    22 Dec 2009
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    Спасибо огромное! Еще вопрос - можно ли этот оператор сделать унарным, как ++?
     
  4. edge911

    edge911 Active Member

    Joined:
    21 Feb 2009
    Messages:
    105
    Likes Received:
    142
    Reputations:
    15
    вроде нет - попробовал не получилось.