Przeładowanie operatorów - więcej argumentów

0

Piszę dość prostą klasę, tak w ramach treningu, no i potrzebuję drobnej pomocy.

Po pierwsze: czy można w jakiś ładny sposób zrobić tak, by dzięki operatorowi + dodawać więcej niż dwa obiekty klasy? Tzn czy można wykonać operację : a=b+c+d+e+f+g... itp

Drugie pytanie dotyczy operatora '' - chciałbym móc mnożyć zarówno a=2b jak i a = b*2, jednak z tego co czytałem to pierwszym argumentem przy przeładowywaniu jest zawsze this na ten obiekt, więc w jaki sposób można to osiągnąć?
To napisałem a propoS przeładowania '
':

Matrix Matrix::operator*(const double &m){
    Matrix result(this->rows, this->columns);
    for(int i=0;i<this->rows;++i){
        for(int j=0; j<this->columns;++j){
            result.tab[i][j]=m*this->tab[i][j];
        }
    }
    return result;
} 
0
  1. Można. Czemu pytasz skoro nawet nie spróbowałeś? Jak przeładujesz operator+ to on zwraca obiekt klasy X, który można dodać do innego obiektu klasy X.
    2. Tak się nie da bo nie możesz przeładować operatora dla typów wbudowanych.
2
  1. Tak się nie da bo nie możesz przeładować operatora dla typów wbudowanych.

He?

Matrix operator*(int, const Matrix&) { ... }

To oczywiście deklaracja operatora poza twoją klasą. Żeby nie wynosić implementacji klasy poza nią możesz w ciele tego operatora zrobić jakieś matrix.Multiply(int) - albo jak dragon niżej zaproponował wywołać już istniejący.

4
  1. Matrix Matrix::operator+(const Matrix &m)const { Matrix tmp; ... return tmp; } // Bez problemu obsłuży serię.
  2. Też się da:
Matrix Matrix::operator*(const double &v)const { ... }
Matrix operator*(const double &v,const Matrix &m) { return m.operator*(v); } // to funkcja nie metoda
0

Napisanie tego operatora w sposób jaki zaproponował _13th_Dragon poza ciałem klasy działa, jednak nie chciałbym by cokolwiek dotyczące klasy było poza nią.

Z tą linijką nie wiem co zrobić za bardzo:

Matrix Matrix::operator*(const double &v)const { ... } 

Dodanie jej kończy się takim samym errorem, jak bez "const".

Edit:
Heh, przeciążenie plusa jednak działało zanim zadałem pytanie - tylko coś źle wywoływałem.

0
xorgx3 napisał(a):

Napisanie tego operatora w sposób jaki zaproponował _13th_Dragon poza ciałem klasy działa, jednak nie chciałbym by cokolwiek dotyczące klasy było poza nią.

Inaczej tego nie zrobisz. Jak przeładowany operator jest wewnątrz klasy to pierwszym parametrem jest zawsze this.

1
xorgx3 napisał(a):

Napisanie tego operatora w sposób jaki zaproponował _13th_Dragon poza ciałem klasy działa, jednak nie chciałbym by cokolwiek dotyczące klasy było poza nią.

Z tą linijką nie wiem co zrobić za bardzo:

Matrix Matrix::operator*(const double &v)const { ... } 

Dodanie jej kończy się takim samym errorem, jak bez "const".

Chrzani waść: http://ideone.com/cOVVAp

0

Dobra, chyba faktycznie tak musi zostać, choć nie podoba mi się definiowanie tego poza ciałem klasy, jeszcze się zastanowię czy na pewno mi potrzebny taki feature :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1